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

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结构,符合Terraform for_each要求的输入格式(必须是map或set,用唯一键做map的key可以避免列表索引变动导致的资源意外销毁重建)
  • 资源块内直接通过each.value取到对应根域名和子域名拼接即可。如果不同根域名对应不同的Route53 zone_id,还可以额外定义一个根域名到zone_id的映射变量,通过each.value.root_domain动态获取对应zone_id,不需要硬编码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:00