Terraform遍历对象列表:解决for_each不支持列表的实现方案
解决Terraform遍历嵌套Zone变量生成Cloudflare记录的问题
要实现遍历嵌套结构的变量生成cloudflare_record资源,核心是把嵌套的zone->记录列表结构转换成Terraform的for_each支持的唯一键值映射,具体步骤如下:
1. 确保变量类型正确(可选,若已定义可跳过)
如果在Terraform中声明该变量,需指定对应类型匹配传入的结构:
variable "zones" { type = map(list(object({ name = string type = string value = string }))) description = "Cloudflare域名区域及下属DNS记录" }
2. 扁平化嵌套结构
通过locals结合双层for表达式,把每个Zone下的记录转换成包含Zone ID的独立对象,同时生成全局唯一的键:
locals { flattened_records = { # 外层遍历每个Zone,内层遍历Zone下的每条记录 for zone_id, records in var.zones : for record in records : # 用Zone ID+记录名生成唯一键,避免重复 "${zone_id}-${record.name}" => merge(record, { zone_id = zone_id }) } }
若同一Zone下存在同名不同类型的记录,需把
type也加入键中,比如"${zone_id}-${record.name}-${record.type}",保证键的唯一性。
3. 遍历生成Cloudflare记录资源
用for_each遍历扁平化后的映射,每条记录对应一个cloudflare_record资源:
resource "cloudflare_record" "record" { for_each = local.flattened_records zone_id = each.value.zone_id name = each.value.name value = each.value.value type = each.value.type }
这样就能自动为每个Zone下的每条记录生成对应的资源,完全符合需求。
内容的提问来源于stack exchange,提问作者Murakami
相关产品推荐
相关产品推荐

