Google cloud platform 如何从Terraform/Pulumi访问云运行服务IP以动态创建记录?
我正在用Pulumi运行谷歌云(类似于Terraform)。我的云运行的域映射设置为:Google cloud platform 如何从Terraform/Pulumi访问云运行服务IP以动态创建记录?,google-cloud-platform,terraform,google-cloud-run,pulumi,Google Cloud Platform,Terraform,Google Cloud Run,Pulumi,我正在用Pulumi运行谷歌云(类似于Terraform)。我的云运行的域映射设置为: 新建gcp.cloudrun.DomainMapping( `${prefix}-域映射`, { 地方 姓名:“xxx”, 元数据:{ 名称空间:projectId, }, 规格:{ routeName:appService.name, }, }, { dependsOn:[appService], }, ) 其中appService指向云运行服务的实例。这将成功创建到云运行服务的域映射 接下来,我将使用记
新建gcp.cloudrun.DomainMapping(
`${prefix}-域映射`,
{
地方
姓名:“xxx”,
元数据:{
名称空间:projectId,
},
规格:{
routeName:appService.name,
},
},
{
dependsOn:[appService],
},
)
其中appService
指向云运行服务的实例。这将成功创建到云运行服务的域映射
接下来,我将使用记录设置DNS区域:
const zone=new gcp.dns.ManagedZone(`${prefix}-zone`{
名称:`${prefix}-zone`,
dnsName:'xxx',
能见度:“公众”,
})
常数ips=['xxx','xxx','xxx','xxx']
新的gcp.dns.RecordSet(
`${prefix}-a-records`,
{
姓名:xxx,
managedZone:zone.name,
键入:“A”,
ttl:3600,
rrdatas:ips,
},
{
dependsOn:[区域],
deleteBeforeReplace:true,
},
)
上面的代码有效。我有一个DNS区域,其中有四个a记录指向4个不同的IP地址,它们指向一个云运行的服务。我的问题是:我如何自动化上面硬编码的IP?我希望为A记录动态设置云运行的IP地址。ips
变量必须指向云运行实例的ips,但我找不到一种方法
或者也许我做错了,还有另一种方法可以做到?我的目标是,如果云运行服务被更新并接收到新的IP,DNS记录也应该自动更新。我不想手动更新地址
由于普卢米或多或少地等同于地形,所以无论是地形还是普卢米的答案都是非常感谢的 我还没有尝试运行此代码,但至少此代码可以编译:
constmapping=newgcp.cloudrun.DomainMapping(…);
const records=mapping.status.resourceRecords?.apply(rs=>rs???[])??脉冲输出([]);
新的gcp.dns.RecordSet(`${prefix}-a-records`{
姓名:xxx,
managedZone:zone.name,
键入:“A”,
ttl:3600,
rrdatas:records.apply(rs=>rs.map(r=>r.rrdata)),
}, {
dependsOn:[区域,映射],
deleteBeforeReplace:true,
});
与
记录的舞蹈
在两个层面上摆脱未定义的
。。。不确定它是否可以简化。我还没有尝试运行此代码,但至少此代码可以编译:
constmapping=newgcp.cloudrun.DomainMapping(…);
const records=mapping.status.resourceRecords?.apply(rs=>rs???[])??脉冲输出([]);
新的gcp.dns.RecordSet(`${prefix}-a-records`{
姓名:xxx,
managedZone:zone.name,
键入:“A”,
ttl:3600,
rrdatas:records.apply(rs=>rs.map(r=>r.rrdata)),
}, {
dependsOn:[区域,映射],
deleteBeforeReplace:true,
});
与
记录的舞蹈
在两个层面上摆脱未定义的
。。。不确定是否可以简化。由于这个问题同时带有Pulumi和Terraform标签,这里有一个可能的Terraform解决方案:
resource "google_cloud_run_domain_mapping" "example" {
location = "us-central1"
name = "xxx"
metadata {
namespace = local.project_name
}
spec {
route_name = google_cloud_run_service.app.name
}
}
resource "google_dns_managed_zone" "example" {
name = "${local.prefix}-zone"
dns_name = "xxx."
visibility = "public"
}
locals {
dns_records = {
"A" = [
for rr in google_cloud_run_domain_mapping.example.resource_records :
rr.rrdata if rr.type == "A"
]
"AAAA" = [
for rr in google_cloud_run_domain_mapping.example.resource_records :
rr.rrdata if rr.type == "AAAA"
]
}
}
resource "google_dns_record_set" "example" {
for_each = local.dns_records
managed_zone = google_dns_managed_zone.example.name
name = "xxx."
type = each.key
ttl = 3600
rrdatas = each.value
}
由于这个问题同时带有Pulumi和Terraform标签,这里有一个可能的Terraform解决方案:
resource "google_cloud_run_domain_mapping" "example" {
location = "us-central1"
name = "xxx"
metadata {
namespace = local.project_name
}
spec {
route_name = google_cloud_run_service.app.name
}
}
resource "google_dns_managed_zone" "example" {
name = "${local.prefix}-zone"
dns_name = "xxx."
visibility = "public"
}
locals {
dns_records = {
"A" = [
for rr in google_cloud_run_domain_mapping.example.resource_records :
rr.rrdata if rr.type == "A"
]
"AAAA" = [
for rr in google_cloud_run_domain_mapping.example.resource_records :
rr.rrdata if rr.type == "AAAA"
]
}
}
resource "google_dns_record_set" "example" {
for_each = local.dns_records
managed_zone = google_dns_managed_zone.example.name
name = "xxx."
type = each.key
ttl = 3600
rrdatas = each.value
}
您正在映射DNS区域(根域)还是DNS区域的子域?对于第一种情况,Cloud Run为A记录提供IP地址。对于第二种情况,Cloud Run为CNAME记录提供了一个DNS名称。我正在映射一个根域。我可以从Cloud Run domain mapping表中获取IP,但我希望它是自动化的。如果将
DomainMapping
分配给mapping
变量,则不会mapping。resourceRecords
包含您需要的内容?它有一个记录列表,其中包含rrdatas字段。但是,在运行Pulumi自动化时,这些记录将不可用。API不会接受记录集中rrdatas字段的resourceRecords。它们将在Pulumi运行期间可用—在创建DomainMapping
资源之后,但在创建RecordSet
之前—您可以分配它,这就是rrdatas
具有Input
类型的原因,不仅仅是字符串数组。您映射的是DNS区域(根域)还是DNS区域的子域?对于第一种情况,Cloud Run为A记录提供IP地址。对于第二种情况,Cloud Run为CNAME记录提供了一个DNS名称。我正在映射一个根域。我可以从Cloud Run domain mapping表中获取IP,但我希望它是自动化的。如果将DomainMapping
分配给mapping
变量,则不会mapping。resourceRecords
包含您需要的内容?它有一个记录列表,其中包含rrdatas字段。但是,在运行Pulumi自动化时,这些记录将不可用。API不会接受记录集中rrdatas字段的resourceRecords。它们将在Pulumi运行期间可用—在创建DomainMapping
资源之后,但在创建RecordSet
之前—您可以分配它,这就是rrdatas
具有Input
类型的原因,不仅仅是字符串数组。这很有效。我不知道apply
功能。它让我可以做一个“内心地图”。我还使用它对数组进行内部筛选,使其仅具有A记录集的A记录。谢谢每当您对输出
或输入
有疑问时,应用
通常就是答案。一定要好好学习这本书。我不知道apply
功能。它让我可以做一个“内心地图”。我还使用它对数组进行内部筛选,使其仅具有A记录集的A记录。谢谢每当您对输出
或输入
有疑问时,应用
通常就是答案。一定要学习我认为你需要的资源