使用Terraform for_each时如何跳过JSON中的重复键
解决Terraform遍历含重复键JSON时的重复项问题
如果你的var.my-ptr-zone是列表类型(比如JSON里是对象数组,存在重复的zone标识键),直接用Terraform的for表达式就能生成无重复键的映射,供for_each使用:
locals { # 生成唯一zone映射,重复键会保留最后一次出现的对象 unique_ptr_zones = { for zone in var.my-ptr-zone : zone."21-10" => zone } } resource "aws_route53_zone" "ptr_zones" { for_each = local.unique_ptr_zones # 根据你的实际配置填写字段 name = each.value.name comment = each.value.comment }
如果需要保留第一次出现的重复项而非最后一次,可以先提取所有唯一的zone标识,再映射到对应对象:
locals { # 获取所有不重复的zone标识 unique_zone_ids = distinct([for z in var.my-ptr-zone : z."21-10"]) # 生成映射,取每个标识对应的第一个对象 unique_ptr_zones = { for id in local.unique_zone_ids : id => [for z in var.my-ptr-zone : z if z."21-10" == id][0] } }
如果你的原始JSON是存在重复键的Map结构(比如{"21-10": {...}, "21-10": {...}}),JSON解析器本身会自动覆盖重复键(保留最后一个)。如果要保留第一个重复键的内容,需要先处理原始JSON字符串:
data "local_file" "ptr_zones" { filename = "./your-json-file.json" } locals { # 提取所有键值对(适合结构简单的JSON,复杂结构需要调整正则) raw_pairs = regexall(`"([^"]+)":\s*({[^}]+})`, data.local_file.ptr_zones.content) # 合并为唯一Map,保留首次出现的键 unique_ptr_zones = merge([ for pair in local.raw_pairs : { pair[0] = jsondecode(pair[1]) } ]...) } resource "aws_route53_zone" "ptr_zones" { for_each = local.unique_ptr_zones # 你的资源配置 }
以上方法不需要修改原始JSON文件,直接在Terraform层面完成去重,适配不同的JSON结构场景。
内容的提问来源于stack exchange,提问作者acuren
相关产品推荐
相关产品推荐

