使用 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/terragrunt 创建多个共享相同子网组和安全组的 redshift 集群
在同一个 TF 脚本中使用多个 Terraform 提供程序(GCP 和 Kubernetes)创建资源
使用 terraform 如何创建一个跨多个项目使用的服务帐户?