如何在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
相关产品推荐
相关产品推荐

