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 } }, ) } ]...)
代码说明:
- 内层
for循环遍历每个config,生成一个包含两个目标键值对的Map。 - 这些小Map会被收集到一个列表中。
- 使用
merge(...)将列表中的所有Map合并为一个大Map,...是Terraform的展开操作符,用于将列表元素作为单独参数传入merge。
内容的提问来源于stack exchange,提问作者davidbilla
相关产品推荐
相关产品推荐

