Terraform从关联map向已有map列表新增键值对避免数据重复
问题根因
你写的嵌套循环逻辑会做笛卡尔积匹配:对每一个账号条目,都会遍历account_map下的所有键值对生成对应记录,相当于每个账号都会生成和account_map元素数相等的条目,最终必然出现大量重复数据,这个场景根本不需要用flatten搭配嵌套循环实现。
正确实现代码
只需要单层循环遍历账号列表,把原有账号属性和匹配到的type字段合并即可,不需要嵌套结构:
locals { accounts = [ { "id" = "111111111111" "status" = "ACTIVE" }, { "id" = "222222222222" "status" = "ACTIVE" } ] account_map = { 111111111111 = "DEV" 222222222222 = "PROD" } # 生成目标结构的逻辑 account_info = [ for acc in local.accounts : merge( acc, { type = lookup(local.account_map, acc.id, null) } ) ] }
逻辑说明
- 直接通过账号id作为key,从
account_map中索引对应的环境类型,不会产生多余的匹配条目 - 用
lookup函数是做容错处理:如果某个账号id没有在account_map中定义,type字段会被赋值为null,不会直接触发Terraform执行报错;如果能保证所有账号id都在map中存在,也可以直接写local.account_map[acc.id]简化代码 - 执行后输出的
account_info结构完全符合预期:
[ { "id" = "111111111111" "status" = "ACTIVE" "type" = "DEV" }, { "id" = "222222222222" "status" = "ACTIVE" "type" = "PROD" } ]
你贴的预期示例里第一个账号id少写了一位,写成了11位的
11111111111,实际生成结果会保留原始变量里的12位正确id。
内容的提问来源于stack exchange,提问作者hlesnt395
相关产品推荐
相关产品推荐

