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

如何在Terraform本地块中提取并重组指定键值对数据

Terraform Local块处理Region-Zone层级JSON的Item提取与合并

实现方案

以下是在Terraform local块中完成需求的具体代码,包含输入示例、处理逻辑和输出结果:

输入JSON示例

{
  "regions": [
    {
      "region_id": "us-east-1",
      "zones": [
        {
          "zone_id": "us-east-1a",
          "items": [
            {
              "type": "Item1a",
              "key1": "value1a-us-east-1a",
              "key2": "value2a-us-east-1a"
            },
            {
              "type": "Item2b",
              "keyX": "valueX-us-east-1a",
              "keyY": "valueY-us-east-1a"
            }
          ]
        },
        {
          "zone_id": "us-east-1b",
          "items": [
            {
              "type": "Item1a",
              "key1": "value1a-us-east-1b",
              "key2": "value2a-us-east-1b"
            }
          ]
        }
      ]
    },
    {
      "region_id": "eu-west-1",
      "zones": [
        {
          "zone_id": "eu-west-1a",
          "items": [
            {
              "type": "Item2b",
              "keyX": "valueX-eu-west-1a",
              "keyY": "valueY-eu-west-1a"
            }
          ]
        }
      ]
    }
  ]
}

Terraform Local块代码

locals {
  # 扁平化所有Region-Zone下的目标Item,并补充Region/Zone标识
  filtered_items = flatten([
    for region in var.input_json.regions : [
      for zone in region.zones : [
        for item in zone.items :
        merge(item, { zone_id = zone.zone_id, region_id = region.region_id })
        if item.type == "Item1a" || item.type == "Item2b"
      ]
    ]
  ])

  # 按Item类型分组,合并不同Zone下的同类型条目
  merged_items = {
    for item in local.filtered_items :
    item.type => concat(
      lookup(local.merged_items, item.type, []),
      [omit(item, "type")]
    )
  }
}

# 输出处理后的结果
output "processed_items" {
  value = local.merged_items
}

输出结果示例

{
  "Item1a": [
    {
      "key1": "value1a-us-east-1a",
      "key2": "value2a-us-east-1a",
      "zone_id": "us-east-1a",
      "region_id": "us-east-1"
    },
    {
      "key1": "value1a-us-east-1b",
      "key2": "value2a-us-east-1b",
      "zone_id": "us-east-1b",
      "region_id": "us-east-1"
    }
  ],
  "Item2b": [
    {
      "keyX": "valueX-us-east-1a",
      "keyY": "valueY-us-east-1a",
      "zone_id": "us-east-1a",
      "region_id": "us-east-1"
    },
    {
      "keyX": "valueX-eu-west-1a",
      "keyY": "valueY-eu-west-1a",
      "zone_id": "eu-west-1a",
      "region_id": "eu-west-1"
    }
  ]
}

关键逻辑说明

  • flatten():将嵌套的Region-Zone-Item列表结构扁平化,简化后续分组操作
  • merge():为每个Item添加所属的region_id和zone_id,保留上下文信息
  • 分组for表达式:以item.type为键,将同类型的Item聚合到同一列表中
  • lookup():处理分组时的初始空列表场景,避免出现键不存在的报错
  • omit():移除Item中的type字段,让输出结构更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:13:38