Terraform 嵌套循环

问题描述 投票:0回答:2

作为 Terraform 的绝对初学者,我希望将 AWS 权限分配给 IAM 用户。我有一组用户名和托管策略,我想将其用于此任务。这是我的变量:

variable "username" {
        type = list(string)
    default = ["name1" ,"name2" , "name3"]
  
}

variable "managedpolicy" {
    type = list(string)
    default = [
        "arn:aws:iam::aws:policy/AmazonEC2FullAccess",
        "arn:aws:iam::aws:policy/AmazonS3FullAccess",
        "arn:aws:iam::aws:policy/AWSLambda_FullAccess"
    ]
}

所有用户都将拥有这3个权限。如何完成这个任务。我需要使用嵌套循环吗?

目前我可以为一个用户执行以下文件。

provider "aws" {
         region = "ap-southeast-1"
}

resource "aws_iam_user_policy_attachment" "attach" {
  user       = var.user
  policy_arn = each.value
  for_each   = toset(var.managedpolicy)
}
terraform terraform-provider-aws
2个回答
0
投票

首先,使用

setproduct
函数创建一个局部变量,其中包含
username
managedpolicy 的所有组合。然后,您可以在附加策略时在 foreach 语句中使用此局部变量。

locals {
combinations = {for val in setproduct(var.username, var.managedpolicy):
                "${val[0]}-${val[1]}" => val}  
}

resource "aws_iam_user_policy_attachment" "attach" {
  for_each   = local.combinations
  user       = each.value[0]
  policy_arn = each.value[1]
}

0
投票

首先,变量应该使用

set(string)
类型定义,因为它们实际上是设置的(这确保了下一步的安全):

type = set(string)

接下来,可以调用 setproduct 函数来返回两个集合的组合矩阵,然后可以将其用作

for_each
元参数的值:

resource "aws_iam_user_policy_attachment" "attach" {
  for_each   = setproduct(var.username, var.managedpolicy)
  user       = each.value[0]
  policy_arn = each.value[1]
}

其中矩阵的每个成员都包含用户作为第一个元素,策略作为第二个元素。

© www.soinside.com 2019 - 2024. All rights reserved.