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

Terraform遍历列表时为每个元素生成两个Map项的实现方法

Terraform 遍历列表生成多Map项问题

我想遍历一个对象列表并创建Map,但需要为循环中的每个元素生成两个Map项。以下是我写的代码,运行时出现语法错误:

variable "id" { 
    default = "my_id" 
}

variable "name" { 
    default = "my_name"  
}

variable "configs" {
   default = [
    { id = 1, from = "value-1-from", to = "value-1-to" },
    { id = 2, from = "value-2-from", to = "value-2-to" },
    { id = 3, from = "value-3-from", to = "value-3-to" }, 
  ]
}

{ for config in var.configs: [
    "${var.name}-${config.id}" => {
      merge(
        { type = { S = "draft" } },
        { from = { S = config.from } },
        { to = { S = config.to } },
      )},
    "${var.id}-${config.id}" => {
      merge(
        { type = { S = "copy" } },
        { from = { S = config.from } },
        { to = { S = config.to } },
     )}
  ]
}

我尝试了其他方法也没解决问题,下面是能正常运行、为每个元素生成单个Map项的版本:

{ for config in var.configs: 
      "${var.name}-${config.id}" => 
      merge(
        { type = { S = "draft" } },
        { from = { S = config.from } },
        { to = { S = config.to } },
      )
}

我需要的最终输出如下:

{
  "my_name-1" = {
    "from" = { "S" = "value-1-from" }
    "to" = { "S" = "value-1-to" }
    "type" = { "S" = "draft" }
  }
  "my_id-1" = {
    "from" = { "S" = "value-1-from" }
    "to" = { "S" = "value-1-to" }
    "type" = { "S" = "copy" }
  }
  "my_name-2" = {
    "from" = { "S" = "value-2-from" }
    "to" = { "S" = "value-2-to" }
    "type" = { "S" = "draft" }
  }
  "my_id-2" = {
    "from" = { "S" = "value-2-from" }
    "to" = { "S" = "value-2-to" }
    "type" = { "S" = "copy" }
  }
  "my_name-3" = {
    "from" = { "S" = "value-3-from" }
    "to" = { "S" = "value-3-to" }
    "type" = { "S" = "draft" }
  }
  "my_id-3" = {
    "from" = { "S" = "value-3-from" }
    "to" = { "S" = "value-3-to" }
    "type" = { "S" = "copy" }
  }
}

解决方案

要实现每个元素生成两个Map项的需求,需要结合merge函数和展开操作符...。核心思路是先为每个配置生成包含两个键值对的小Map,再把所有小Map合并成一个大Map。

修改后的代码如下:

merge([
  for config in var.configs : {
    "${var.name}-${config.id}" => merge(
      { type = { S = "draft" } },
      { from = { S = config.from } },
      { to = { S = config.to } },
    ),
    "${var.id}-${config.id}" => merge(
      { type = { S = "copy" } },
      { from = { S = config.from } },
      { to = { S = config.to } },
    )
  }
]...)

代码说明:

  1. 内层for循环遍历每个config,生成一个包含两个目标键值对的Map。
  2. 这些小Map会被收集到一个列表中。
  3. 使用merge(...)将列表中的所有Map合并为一个大Map,...是Terraform的展开操作符,用于将列表元素作为单独参数传入merge。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:34:52