You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中遍历嵌套Map创建AWS Route53记录?

遍历嵌套Map创建Route53记录

要解决嵌套Map的遍历问题,你需要先把嵌套结构扁平化,再用for_each遍历扁平化后的集合来创建每个Route53记录。以下是具体实现步骤:

1. 扁平化嵌套变量

先定义一个局部值(local),把嵌套的hosted_zones_domains转换成扁平的记录列表,每个元素包含托管区名称、记录名和对应IP:

locals {
  # 扁平化嵌套Map,生成包含所有记录的列表
  route53_records = flatten([
    for zone_name, records in var.hosted_zones_domains : [
      for record_name, record_value in records : {
        zone_name     = zone_name
        record_name   = record_name
        record_value  = record_value
      }
    ]
  ])

  # 转换为Map格式(for_each要求使用集合或Map),用唯一键标识每个记录
  route53_records_map = {
    for rec in local.route53_records : "${rec.zone_name}-${rec.record_name}" => rec
  }
}

2. 创建Route53记录资源

基于扁平化后的Map,遍历创建每个A记录,并关联对应的托管区ID:

resource "aws_route53_record" "subdomain_records" {
  for_each = local.route53_records_map

  # 关联对应的托管区ID
  zone_id = aws_route53_zone.subdomain_zone[each.value.zone_name].zone_id
  # 记录名(这里用变量中的完整域名,也可以优化为相对域名)
  name    = each.value.record_name
  # 记录类型,这里是A记录(IPv4地址)
  type    = "A"
  # 缓存时间
  ttl     = "300"
  # 记录值(IP地址)
  records = [each.value.record_value]

  tags = {
    Environment = var.environment
  }
}

优化:使用相对域名(可选)

如果你的记录名是完整域名(比如beta.first-example.com),而托管区是first-example.com,可以把记录名简化为相对域名(仅beta),避免重复后缀:

name = replace(each.value.record_name, ".${each.value.zone_name}", "")

这样设置后,Route53会自动拼接托管区域名,最终生成的记录依然是beta.first-example.com,更符合规范。

内容的提问来源于stack exchange,提问作者mathrixx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:30:13