如何在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
相关产品推荐
相关产品推荐

