作为 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)
}
首先,使用
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]
}
首先,变量应该使用
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]
}
其中矩阵的每个成员都包含用户作为第一个元素,策略作为第二个元素。