Terraform 用于创建地图的地形插值

Terraform 用于创建地图的地形插值,terraform,terraform-provider-aws,terraform0.12+,Terraform,Terraform Provider Aws,Terraform0.12+,我正在努力进行插值,下面有一些变量 primary = ["foo.dev","all.bar.com"] secondary = ["module.foo.dev","*.foo.dev","all.bar.com"] 我希望我的输出是 { "foo.dev" = ["module.foo.dev","*foo.dev"]

我正在努力进行插值,下面有一些变量

primary = ["foo.dev","all.bar.com"]
secondary = ["module.foo.dev","*.foo.dev","all.bar.com"]
我希望我的输出是

{
     "foo.dev" = ["module.foo.dev","*foo.dev"]
     "all.bar.com" = ["all.bar.com"]
}
使用Terraform 0.12.20

我在terraform控制台中进行了尝试,但未能实现所需的输出。有什么简单的解决办法吗

[for i in ["foo.dev","all.bar.com"]: map(i,[for j in ["module.foo.dev","*foo.dev","all.bar.com"]: replace(j,i,"")!=j == true ? j : 0])]
[
  {
    "foo.dev" = [
      "module.foo.dev",
      "*foo.dev",
      "0",
    ]
  },
  {
    "all.bar.com" = [
      "0",
      "0",
      "all.bar.com",
    ]
  },
]

可以使用以下表达式执行此操作:

{ for i in ["foo.dev", "all.bar.com"] : i => [for j in ["module.foo.dev", "*foo.dev", "all.bar.com"] : j if can(regex(i, j))] }
这将产生以下值:

{
  "all.bar.com" = [
    "all.bar.com",
  ]
  "foo.dev" = [
    "module.foo.dev",
    "*foo.dev",
  ]
}
这正是你所要求的

迭代解释如下:

首先,指定类型为映射:

{}
现在,我们应该迭代第一个列表中的元素:

{ for i in ["foo.dev", "all.bar.com"] : }
接下来,我们将
i
值分配给映射的键,并初始化该值的列表:

{ for i in ["foo.dev", "all.bar.com"] : i => [] }
{ for i in ["foo.dev", "all.bar.com"] : i => [for j in ["module.foo.dev", "*foo.dev", "all.bar.com"] : j if can(regex(i, j))] }
但是,我们需要将第二个列表中的元素的值分配给结果映射的键的列表(下面的示例是次优的,因为我们不需要表达式的,但它对于下一步是说明性的):

最后,我们希望根据键过滤列表值中的元素。我们可以在
regex
函数之外使用
can
函数,根据是否存在匹配返回布尔值。我们将其用作是否应将第二个列表的元素添加到值中的列表的条件:

{ for i in ["foo.dev", "all.bar.com"] : i => [] }
{ for i in ["foo.dev", "all.bar.com"] : i => [for j in ["module.foo.dev", "*foo.dev", "all.bar.com"] : j if can(regex(i, j))] }

我们已经找到了解决方案。

你能解释一下这种关联的逻辑吗。。。为什么不从一开始就提供正确的地图呢?