Terraform:转换Map至新键时修改ZipMap对应值
Terraform Map转换:生成指定结构的goodness Map
需求说明
需要将给定的accounts Map转换为goodness Map,需完成三项核心操作:
- 以每个条目里唯一的
future-key作为新Map的键 - 将原Map的键作为
acct-key属性,插入到新Map的对应条目中 - 删除所有以
private-attribute-开头的私有属性
输入输出示例
原accounts Map
accounts = { "acct-key-1" = { "billingcode" = "sys" "future-key" = "SOME-UNIQUE-VALUE-1" "private-attribute-1" = "fee" "private-attribute-2" = "foe" } "acct-key-2" = { "billingcode" = "sys" "future-key" = "SOME-UNIQUE-VALUE-2" "private-attribute-1" = "fie" "private-attribute-2" = "fum" } }
目标goodness Map
goodness = { "SOME-UNIQUE-VALUE-1" = { "billingcode" = "sys" "acct-key" = "acct-key-1" } "SOME-UNIQUE-VALUE-2" = { "billingcode" = "sys" "acct-key" = "acct-key-2" } }
当前问题
使用zipmap仅完成了键的替换,但未添加acct-key属性,也未移除私有属性,嵌套for循环尝试未成功。当前代码如下:
locals { # get source map accts = jsondecode(file("${path.module}/question.json")) newkeys = values(local.accts)[*].future-key newvalues = values(local.accts) partial = zipmap( local.newkeys, local.newvalues ) } output "accounts" { value = local.accts } output "newkeys" { value = local.newkeys } output "newvalues" { value = local.newvalues } output "partial" { value = local.partial }
解决方案
使用Terraform的for表达式可以一次性完成所有转换需求,它支持同时遍历原Map的键和值,还能对条目进行过滤和修改:
修正后的代码
locals { accts = jsondecode(file("${path.module}/question.json")) # 核心转换逻辑 goodness = { # 外层for:遍历原Map的键(acct_key)和值(acct_val) for acct_key, acct_val in local.accts : # 新Map的键:用原条目的future-key acct_val["future-key"] => merge( # 添加原键作为acct-key属性 { "acct-key" = acct_key }, # 内层for:过滤掉私有属性和future-key本身 { for k, v in acct_val : k => v if !startswith(k, "private-attribute-") && k != "future-key" } ) # 可选:跳过没有future-key的条目(防止生成无效键) if acct_val["future-key"] != null } } output "goodness" { value = local.goodness }
代码逻辑说明
- 外层for表达式:遍历原
accounts的每一个键值对,用future-key作为新Map的键 - merge函数:将新增的
acct-key属性和过滤后的原条目属性合并 - 内层for表达式:
- 过滤掉所有以
private-attribute-开头的私有属性 - 排除
future-key本身(因为目标结构里不需要这个字段)
- 过滤掉所有以
- 末尾的if判断:可选,避免因
future-key为空生成无效的Map键
内容的提问来源于stack exchange,提问作者rpc
相关产品推荐
相关产品推荐

