【问题标题】:Create multiple DNS Route53 A record using Terraform使用 Terraform 创建多个 DNS Route53 A 记录
【发布时间】: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。

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

【问题讨论】:

    标签: amazon-ec2 terraform amazon-route53 terraform-provider-aws terraform0.12+


    【解决方案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]
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2021-11-13
      • 2018-11-16
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多