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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:20:38