如何从Terraform / Pulumi访问Cloud Run服务IP以动态创建A记录?

Kai*_*ren 4 google-cloud-platform terraform pulumi google-cloud-run

我正在使用 Google Cloud Run 和 Pulumi(类似于 Terraform)。我的 Cloud Run 域映射设置是:

  new gcp.cloudrun.DomainMapping(
    `${prefix}-domain-mapping`,
    {
      location,
      name: 'xxx',
      metadata: {
        namespace: projectId,
      },
      spec: {
        routeName: appService.name,
      },
    },
    {
      dependsOn: [appService],
    },
  )
Run Code Online (Sandbox Code Playgroud)

其中appService指向 Cloud Run 服务的实例。这成功创建了到 Cloud Run 服务的域映射。

接下来我将设置一个包含记录的 DNS 区域:

  const zone = new gcp.dns.ManagedZone(`${prefix}-zone`, {
    name: `${prefix}-zone`,
    dnsName: 'xxx.',
    visibility: 'public',
  })

  const ips = ['xxx', 'xxx', 'xxx', 'xxx']
  new gcp.dns.RecordSet(
    `${prefix}-a-records`,
    {
      name: 'xxx.',
      managedZone: zone.name,
      type: 'A',
      ttl: 3600,
      rrdatas: ips,
    },
    {
      dependsOn: [zone],
      deleteBeforeReplace: true,
    },
  )
Run Code Online (Sandbox Code Playgroud)

上面的代码有效。我有一个 DNS 区域,其中有 4 个 A 记录,分别指向 4 个不同的 IP 地址,这些 IP 地址指向 Cloud Run 服务。我的问题是:如何自动化上面硬编码的 IP?我希望为 A 记录动态设置 Cloud Run 的 IP 地址。该ips变量必须指向 Cloud Run 实例的 IP,但我找不到方法来做到这一点。

或者也许我做错了,应该有另一种方法来完成?我的目标是,如果 Cloud Run 服务更新并收到新的 IP,DNS 记录也应该自动更新。我不想手动更新地址。

由于 Pulumi 或多或少相当于 Terraform,因此非常感谢 Terraform 或 Pulumi 中的答案!

Mar*_*ins 7

由于这个问题同时带有 PulumiTerraform 标签,因此这里有一个可能的 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
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为您需要迭代的资源是“google_cloud_run_domain_mapping.example.status[0].resource_records”。 (3认同)