Terraform 0.12 - 从嵌套的 for 循环生成地图/对象

let*_*ers 9 terraform

作为Terraform 0.12 嵌套 for 循环的后续。我试图从嵌套循环中生成一个对象,但失败得很惨:(

您将如何进行生产:

  Outputs:

  association-list = {
    "policy1" = "user1"
    "policy2" = "user1"
    "policy2" = "user2"
  }
Run Code Online (Sandbox Code Playgroud)

从:

iam-policy-users-map = {
  "policy1" = [ "user1" ]
  "policy2" = [ "user1", "user2" ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试了许多变体:

variable iam-policy-users-map {
  default = {
    "policy1" = [ "user1" ]
    "policy2" = [ "user1", "user2" ]
  }
}

locals {
  association-map = merge({
    for policy, users in var.iam-policy-users-map : {
      for user in users : {
        policy => user
      }
    }
  })

output association-map {
  value = local.association-map
}
Run Code Online (Sandbox Code Playgroud)

到目前为止成功率为零。根据变化仅设法获得以下内容:

错误:无效的“for”表达式。'for' 表达式结束后的额外字符。

错误:缺少属性值。需要一个由等号 ("=") 引入的属性值。

错误:无效的“for”表达式。构建对象时需要键表达式。

错误:缺少键/值分隔符。需要等号 ("=") 来标记属性值的开头。

作为参考,以下代码能够生成地图列表:

variable iam-policy-users-map {
  default = {
    "policy1" = [ "user1" ]
    "policy2" = [ "user1", "user2" ]
  }
}

locals {    
  association-list = flatten([
    for policy, users in var.iam-policy-users-map : [
      for user in users : {
        user   = user
        policy = policy
      }
    ]
  ])
}

output association-list {
  value = local.association-list
}
Run Code Online (Sandbox Code Playgroud)

输出:

关联列表 = [ { “policy” = “policy1” “user” = “user1” }, { “policy” = “policy2” “user” = “user1” }, { “policy” = “policy2” “user” = "用户 2" }, ]

let*_*ers 6

部分答案可以在https://github.com/hashicorp/terraform/issues/22263找到。长话短说:这是一个愚蠢的尝试,地图不能包含重复的键。

然而,我仍然有兴趣了解如何从嵌套的 for 循环生成地图地图。请参阅上面的第二个代码示例,生成地图列表。

编辑:在上面链接的 github 问题上给出了完整的答案。

“这(显然)是一个无用的结构,但我想说明这是可能的:

locals {
  association-list = {
    for policy, users in var.iam-policy-users-map:
      policy => {      // can't have the nested for expression before the key!
        for u in users:
           policy => u...
      }
  }
}

Outputs:

association-list = {
  "policy1" = {
    "policy1" = [
      "user1",
    ]
  }
  "policy2" = {
    "policy2" = [
      "user1",
      "user2",
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)