如何在Terraform中使用flatten获得地图?



我有这样一个变量:

applications = {
"app-name" = {
more_stuff = "x"
environments = ["dev", "stg"]
}
"workload" = {
random_thing = "y"
environments = ["dev"]
}
}

我想从它创建这个地图:

application_envs = {
"app-name-dev" = { more_stuff = "x" }
"app-name-stg" = { more_stuff = "x" }
"workload-dev" = { random_thing = "y" }
}

我试过使用flatten,但我没有任何成功:

application_envs = flatten([
for application_key, application in var.applications : [
for env in application.environments : [
{"${application_key}-${env}" = workspace}
]
]
])

问题是它创建了一个对象列表:

result = [
{ "app-name-dev" = { ... } },
{ "app-name-stg" = { ... } },
...
]

我怎样才能达到我想要的结果?

您的方向是正确的,但是对于这种数据转换,算法需要两个步骤。第一步完全正确,但现在需要第二步:

result = { for app_env in application_envs : keys(app_env)[0] => values(app_env)[0] }

通过迭代地将每个对象元素的键映射到每个对象元素的值来转换list(object)。测试输出产生:

result = {
app-name-dev = {
more_stuff = "x"
}
app-name-stg = {
more_stuff = "x"
}
}

。由于问题中省略了变量的名称空间,我也同样从答案中省略了它们,但是在问题代码和实际代码之间进行转换时,您可能需要自己重新添加它们。

最新更新