使用 Terraform 创建多个 DNS Route53 A 记录

Posted

技术标签:

【中文标题】使用 Terraform 创建多个 DNS Route53 A 记录【英文标题】:Create multiple DNS Route53 A record using Terraform 【发布时间】:2021-10-21 11:02:01 【问题描述】:

我已经使用 terraform 创建了一些 AWS EC2 实例,如下所示:

resource "aws_instance" "deploya"
....

resource "aws_instance" "deployb"
....

resource "aws_instance" "deployc"
....

对于上面的aws_instances,我想创建route_53一条记录。

我在本地人中有 A 记录的名称,如下所示。它们也用于脚本中的许多其他地方

locals 
    namea = "namea.aws.ra.com"
    nameb = "nameb.aws.ra.com"
    namec = "namec.aws.ra.com"
   

我知道我可以为每个 aws_instance 创建 Route53 A 记录,如下所示:

resource "aws_route53_record" "www" 
      allow_overwrite = true
      zone_id = data.aws_route53_zone.selected.zone_id
      name    = local.namea
      type    = "A"
      ttl     = "300"
      records = [aws_instance.deploya.private_ip]
    

我在上述手动方法中面临的问题是代码长度、重复性和可维护性我想在这里使用一些迭代来保持代码紧凑,但我无法弄清楚这是 Terraform 的新手。此外,可能还有更多 aws_instances。

这里的代码如何保持紧凑?

【问题讨论】:

【参考方案1】:

创建资源时可以使用for_each:

locals 
  instances = 
    namea = "namea.aws.ra.com"
    nameb = "nameb.aws.ra.com"
    namec = "namec.aws.ra.com"
  

resource "aws_route53_record" "www" 
  for_each        = local.instances
  allow_overwrite = true
  zone_id         = data.aws_route53_zone.selected.zone_id
  name            = each.value
  type            = "A"
  ttl             = "300"
  records         = [aws_instance.deploya.private_ip]

【讨论】:

问题中没有明确说明,但我猜OP希望 deploya.private_ip 使用namea,deployb.private_ip 使用nameb等。所以你宁愿有一张地图而不是a使用for_each进行迭代的列表 @GrzegorzOledzki 我已经在地图上进行了迭代并得到了预期的结果。【参考方案2】:

回答我自己的问题。如果有人想为 N 数量的 ec2 实例创建 N 数量的 A 记录,请您可以使用 map 来迭代键和值。

locals 
  host_names = 
    namea = "namea.aws.ra.com"
    nameb = "nameb.aws.ra.com"
    namec = "namec.aws.ra.com"
  
  deploy_names = 
    deploya = aws_instance.deploya
    deployb = aws_instance.deployb
    deployc = aws_instance.deployc
  
  host_deploy_names = zipmap(values(local.host_names),values(local.deploy_names))

resource "aws_route53_record" "www" 
  for_each        = local.host_deploy_names
  allow_overwrite = true
  zone_id         = data.aws_route53_zone.selected.zone_id
  name            = each.key
  type            = "A"
  ttl             = "300"
  records         = [each.value.private_ip]

【讨论】:

以上是关于使用 Terraform 创建多个 DNS Route53 A 记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 创建多个 GCP 存储桶

使用 terraform/terragrunt 创建多个共享相同子网组和安全组的 redshift 集群

在同一个 TF 脚本中使用多个 Terraform 提供程序(GCP 和 Kubernetes)创建资源

使用 terraform 如何创建一个跨多个项目使用的服务帐户?

使用 Terraform 将自定义 DNS 服务器 IP 添加到 Azure VM NIC

具有 Terraform 的多个提供程序版本