Google cloud platform 如何从Terraform/Pulumi访问云运行服务IP以动态创建记录?

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指向云运行服务的实例。这将成功创建到云运行服务的域映射 接下来,我将使用记

我正在用Pulumi运行谷歌云(类似于Terraform)。我的云运行的域映射设置为:

新建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记录。谢谢每当您对
输出
输入
有疑问时,
应用
通常就是答案。一定要学习我认为你需要的资源