使用的 Terraform 版本为 0.11。
我正在运行多个 eks 集群,并尝试按照此文档在所有集群中启用基于 IAM 角色的服务帐户: https://www.terraform.io/docs/providers/aws/r/eks_cluster.html#enabling-iam-roles-for-service-accounts
当我在策略语句中硬编码集群名称并创建多个语句时,它可以工作。
data "aws_iam_policy_document" "example_assume_role_policy" {
# for cluster 1
statement {
actions = ["sts:AssumeRoleWithWebIdentity"]
effect = "Allow"
condition {
test = "StringEquals"
variable = "${replace(aws_iam_openid_connect_provider.example1.url, "https://", "")}:sub"
values = ["system:serviceaccount:kube-system:aws-node"]
}
principals {
identifiers = ["${aws_iam_openid_connect_provider.example1.arn}"]
type = "Federated"
}
}
}
因为我有多个集群,所以我希望能够动态生成语句,因此我进行了以下更改:
我创建了一个 count
变量,并更改了 principals 和 condition 中的值。
count = "${length(var.my_eks_cluster)}"
condition {
test = "StringEquals"
variable = "${replace(element(aws_iam_openid_connect_provider.*.url, count.index), "https://", "")}:sub"
values = ["system:serviceaccount:kube-system:aws-node"]
}
principals {
identifiers = ["${element(aws_iam_openid_connect_provider.*.url, count.index)}"]
type = "Federated"
}
Terraform现在可以找到集群,但也能生成多个策略。 然而这样是行不通的,因为在如下语法中,"assume_role_policy"不能接受列表。
resource "aws_iam_role" "example" {
assume_role_policy = "${data.aws_iam_policy_document.example_assume_role_policy.*.json}"
name = "example"
}
似乎我需要在一个策略中生成多个声明(以便可以添加到一个iam_role),而不是创建多个策略。有没有人之前做过类似的事情?谢谢。