Terraform遍历列表映射实现单资源块批量创建多域名DNS记录
完全可以实现,核心是先将你定义的二维域名映射展平为for_each支持的一维唯一结构即可,完整实现代码如下:
# 根域名-子域名映射变量,和你预期的写法一致 variable "subdomains" { type = map(list(string)) default = { "domain1.com" = ["www", "www2"] "domain2.com" = ["www3", "www1"] } } # 预处理域名数据,生成符合for_each要求的结构 locals { # 嵌套遍历所有根域名、子域名组合,拆分为独立的记录对象 flattened_records = flatten([ for root_domain, sub_list in var.subdomains : [ for sub in sub_list : { root_domain = root_domain sub_domain = sub # 生成唯一标识,避免不同根域名下相同子域名冲突 unique_key = "${root_domain}:${sub}" } ] ]) # 转换为map结构,适配for_each输入要求 record_map = { for record in local.flattened_records : record.unique_key => record } } # 单个资源块批量创建所有DNS记录 resource "aws_route53_record" "all_domains" { for_each = local.record_map type = "A" name = "${each.value.sub_domain}.${each.value.root_domain}" zone_id = "" # 补充其他需要的参数,比如ttl、records等 ttl = 300 records = ["1.1.1.1"] }
逻辑说明
- 先用嵌套
for循环遍历所有根域名和对应的子域名,把每一组(根域名+子域名)拆成独立的对象,同时生成唯一键避免冲突 flatten函数将嵌套的列表压平为一维列表,再转换为map结构,符合Terraformfor_each要求的输入格式(必须是map或set,用唯一键做map的key可以避免列表索引变动导致的资源意外销毁重建)- 资源块内直接通过
each.value取到对应根域名和子域名拼接即可。如果不同根域名对应不同的Route53 zone_id,还可以额外定义一个根域名到zone_id的映射变量,通过each.value.root_domain动态获取对应zone_id,不需要硬编码。
内容的提问来源于stack exchange,提问作者user226335
相关产品推荐
相关产品推荐

