嵌套循环和遍历 Terraform 中的地图

Nested loops and looping over maps in Terraform

我正在编写一个需要创建“aws_iam_group_policy_attachment”资源的模块。此资源需要一个组名称(字符串)和一个策略名称(字符串)。 我尝试使用不同的数据结构,但最有意义的是这样的:

地图列表:

iam_groups = [
    { name = "testgroup1", policies = [ "Arn1", "Arn2" ] },
    { name = "testgroup2", policies = [ "Arn1", "Arn3", "Arn4" ] }
  ]

地图中的地图:

iam_groups = {
  "testgroup1" = { name = "testgroup1", policies = ["Arn1", "Arn2" ] }
  "testgroup2" = { name = "testgroup2", policies = ["Arn1", "Arn3", "Arn4" ] }
}

因为该资源不支持提供策略列表,我的想法是我需要创建一个结构来支持每组 Group:Policy 的每种组合,所以我定义了一个带有嵌套的辅助局部变量for 循环:

groups = flatten([ for group in var.iam_groups : [ for policy in group.policies : { (group.name) = policy } ] ])

这给了我正确的值组合:

  + GROUPS  = [
      + {
          + testgroup1 = "Arn1"
        },
      + {
          + testgroup1 = "Arn2"
        },
      + {
          + testgroup2 = "Arn1"
        },
      + {
          + testgroup2 = "Arn3"
        },
      + {
          + testgroup2 = "Arn4"
        },
    ]

现在,我的问题是如何在“aws_iam_group_policy_attachment”资源中使用它?

此外,是否有其他更好的方法来构建我的数据以实现此目的?

我尝试使用:

resource "aws_iam_group_policy_attachment" "this" {
  for_each = local.groups

  group = each.key
  policy_arn = each.value
}

但这给出了一个错误,即“for_each”需要一个映射或字符串列表,其中我有一个包含多个元素的“元组”。

我想避免的是维护一个变量,该变量必须手动和静态地将所有组映射到每个单独的策略,并重复很多。

for each 最好使用 map,而不是列表,因为列表取决于项目的顺序:


locals {

  groups = merge([ for group in var.iam_groups : {
                    for policy in group.policies :  
                          "${group.name}-${policy}" => { 
                                policy = policy 
                                group_name =  group.name
                                }
                    } ]...) # please do NOT remove the dots                       
}

然后

resource "aws_iam_group_policy_attachment" "this" {
  for_each = local.groups

  group = each.value.group_name
  policy_arn = each.value.policy
}