首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Terraform / Pulumi访问云运行服务IP来动态创建A记录?

如何从Terraform / Pulumi访问云运行服务IP来动态创建A记录?
EN

Stack Overflow用户
提问于 2020-03-01 19:57:08
回答 2查看 797关注 0票数 4

我正在使用Google与Pulumi一起运行(类似于Terraform)。云运行域映射的设置是:

代码语言:javascript
复制
  new gcp.cloudrun.DomainMapping(
    `${prefix}-domain-mapping`,
    {
      location,
      name: 'xxx',
      metadata: {
        namespace: projectId,
      },
      spec: {
        routeName: appService.name,
      },
    },
    {
      dependsOn: [appService],
    },
  )

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

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

代码语言:javascript
复制
  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,
    },
  )

上面的代码起作用。我有一个DNS区域,有四个A记录指向4个不同的IP地址,指向一个云运行服务。我的问题是:如何使is自动化,而我在上面已经进行了硬编码?我希望为A记录动态设置云的IP地址。ips变量必须指向云运行实例的I,但我找不到这样的方法。

或者我做错了,还有另外一种方法吗?我的目标是,如果Cloud服务被更新并接收新的is,那么DNS记录也应该自动更新。我不想手动更新地址。

由于普利米或多或少等同于Terraform,所以无论是Terraform还是Pulumi的答案都是非常感谢的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-02 20:48:53

我还没有尝试运行这个程序,但至少这段代码编译了:

代码语言:javascript
复制
const mapping = new gcp.cloudrun.DomainMapping(...);

const records = mapping.status.resourceRecords?.apply(rs => rs ?? []) ?? pulumi.output([]);

new gcp.dns.RecordSet(`${prefix}-a-records`, {
    name: 'xxx.',
    managedZone: zone.name,
    type: 'A',
    ttl: 3600,
    rrdatas: records.apply(rs => rs.map(r => r.rrdata)),
}, {
    dependsOn: [zone, mapping],
    deleteBeforeReplace: true,
});

records共舞是为了在两个层次上摆脱undefined .不确定它是否可以简化。

票数 3
EN

Stack Overflow用户

发布于 2020-03-04 00:49:00

由于这个问题同时带有Pulumi和Terraform标记,下面是一个可能的Terraform解决方案:

代码语言:javascript
复制
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
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60479206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档