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

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
}

代码逻辑说明

  1. 外层for表达式:遍历原accounts的每一个键值对,用future-key作为新Map的键
  2. merge函数:将新增的acct-key属性和过滤后的原条目属性合并
  3. 内层for表达式:
    • 过滤掉所有以private-attribute-开头的私有属性
    • 排除future-key本身(因为目标结构里不需要这个字段)
  4. 末尾的if判断:可选,避免因future-key为空生成无效的Map键

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:15:33