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

如何合并Terraform映射?现有代码输出不符预期求修正

解决方案

当前代码的问题在于,你通过两层for表达式生成了嵌套的Map结构,外层保留了foo/bar作为键。要得到扁平的顶层Map,需要直接遍历所有嵌套的键值对并合并到同一层级,有两种简洁的实现方式:

方式一:使用双重for表达式直接生成扁平Map

直接在Map构造中使用嵌套的for循环,遍历所有子项的values并生成带前缀的键值对:

locals {
  items = { 
    foo = {
      config = {
        prefix = "foo-prefix:"
        values = {
          "key1" : "value1",
          "key2" : "value2"
        }
      }
    },
    bar = {
      config = {
        prefix = "bar-prefix:"
        values = {
          "key3" : "value3",
          "key4" : "value4"
        }
      }
    }
  }

  # 修改后的result定义
  result = {
    for _, item in local.items :
    for key, val in item.config.values :
    "${item.config.prefix}${key}" => val
  }
}

output "result" {
  value = local.result
}

这种方式利用Terraform对多for表达式的支持,一次性遍历所有层级的元素,直接生成目标扁平Map。

方式二:结合merge()函数合并子Map

先为每个item生成带前缀的子Map,再通过merge()将所有子Map合并为一个顶层Map:

locals {
  items = { 
    foo = {
      config = {
        prefix = "foo-prefix:"
        values = {
          "key1" : "value1",
          "key2" : "value2"
        }
      }
    },
    bar = {
      config = {
        prefix = "bar-prefix:"
        values = {
          "key3" : "value3",
          "key4" : "value4"
        }
      }
    }
  }

  # 修改后的result定义
  result = merge([
    for _, item in local.items : {
      for key, val in item.config.values : "${item.config.prefix}${key}" => val
    }
  ]...)
}

output "result" {
  value = local.result
}

这里的[...]生成一个包含多个子Map的列表,...是Terraform的展开运算符,将列表元素作为merge()的多个参数,最终合并为单一Map。

两种方式都能得到你期望的输出结果:

result = {
  "bar-prefix:key3" = "value3"
  "bar-prefix:key4" = "value4"
  "foo-prefix:key1" = "value1"
  "foo-prefix:key2" = "value2"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:09:50