【发布时间】:2019-09-26 13:47:48
【问题描述】:
我正在尝试使用 Terraform 0.12 的新功能实现嵌套 for 循环,以便遍历 AWS IAM 用户,每个用户都可以附加一个或多个策略。用来表示这个列表的变量是 map(list(string)) 类型的,看起来像这样:
{
"user 1" = [ "policy1", "policy2" ],
"user 2" = [ "policy1" ]
}
通过keys() 获取要创建的用户列表很容易,但由于目前在 Terraform 中没有嵌套循环资源创建的机制,因此策略附件必须作为独立于每个用户的单个循环发生。因此,我正在尝试从地图输入中构建一个 user:policy 关联列表,根据上面的示例,它看起来像这样:
[
[ "user1", "policy1" ],
[ "user1", "policy2" ],
[ "user2", "policy1" ]
]
我正在尝试构造该列表并将其存储在像这样的局部变量中,其中var.iam-user-policy-map 是输入映射:
locals {
...
association-list = [
for user in keys(var.iam-user-policy-map):
[
for policy in var.iam-user-policy-map[user]:
[user, policy]
]
]
...
}
但是,我在尝试访问该嵌套列表中的值时遇到错误。我正在尝试使用引用 local.association-list[count.index][0] 和使用 local.association-list[count.index][1] 的策略访问关联的用户部分,但是在运行 terraform plan 时会出错:
Error: Incorrect attribute value type
on main.tf line 27, in resource "aws_iam_user_policy_attachment" "test-attach":
27: user = local.association-list[count.index][0]
Inappropriate value for attribute "user": string required.
Error: Incorrect attribute value type
on main.tf line 27, in resource "aws_iam_user_policy_attachment" "test-attach":
27: user = local.association-list[count.index][0]
Inappropriate value for attribute "user": string required.
Error: Invalid index
on main.tf line 28, in resource "aws_iam_user_policy_attachment" "test-attach":
28: policy_arn = "arn:aws-us-gov:iam::aws:policy/${local.association-list[count.index][1]}"
|----------------
| count.index is 0
| local.association-list is tuple with 2 elements
The given key does not identify an element in this collection value.
Error: Invalid template interpolation value
on main.tf line 28, in resource "aws_iam_user_policy_attachment" "test-attach":
28: policy_arn = "arn:aws-us-gov:iam::aws:policy/${local.association-list[count.index][1]}"
|----------------
| count.index is 1
| local.association-list is tuple with 2 elements
Cannot include the given value in a string template: string required.
我做错了什么?
【问题讨论】: