【发布时间】:2021-12-11 08:49:56
【问题描述】:
main.tf
module "iam_assumable_role" {
for_each = var.service_accounts
source = "../../../../../../modules/iam-assumable-role-with-oidc/"
create_role = true
role_name = each.value.name
provider_url = replace(module.eks.cluster_oidc_issuer_url, "https://", "")
// role_policy_arns = [for i in each.value.policies : "aws_iam_policy.${i}.arn"]
oidc_fully_qualified_subjects = each.value.wildcard == "" ? ["system:serviceaccount:${each.value.namespace}:${each.value.name}"] : []
oidc_subjects_with_wildcards = each.value.wildcard != "" ? ["system:serviceaccount:${each.value.namespace}:${each.value.wildcard}"] : []
tags = var.tags
}
resource "aws_iam_policy" "dev-policy1" {
name_prefix = "dev-policy"
description = "some description"
policy = data.aws_iam_policy_document.dev-policy1.json
}
variable "service_accounts" {
type = map(object({
name = string
namespace = string
wildcard = string
policies = list(any)
}))
}
tfvars
service_accounts = {
"dev-sa" = {
"name" = "dev-sa",
"namespace" = "dev",
"wildcard" = "*",
"policies" = ["dev-policy1", "dev-policy2"]
},
"qa-sa" = {
"name" = "qa-sa",
"namespace" = "qa",
"wildcard" = "*",
"policies" = ["qa-policy1", "qa-policy2"]
}
}
我的代码正在迭代 service_accounts 变量并创建适当的资源。问题是,在注释行中,我无法获取所提供策略名称的 aws_iam_policy.arn 列表(策略名称通过 service_account 变量提供)。我当前的代码将 aws_iam_policy.PolicyName.arn 作为字符串返回,而不是实际值。请注意, dev-policy1 资源只是所有策略资源之一。所有政策文件也都存在。当我直接而不是通过变量提供策略列表时,模块本身可以正常工作。
是否有可能在 terraform 中实现期望?
【问题讨论】:
-
还没有运气,提供的答案也不起作用,因为有些情况下政策是相同的。例如dev-sa 有 dev-policy1 和 dev-policy2 策略,而 dev-sa2 有 dev-policy1 和 dev-policy3。此外 ${i} 不带引号也不起作用,当添加引号时,tf 将其理解为列表而不是真正的策略值。
-
您的问题没有提供这样一个政策相同的用例。给出的答案是基于您所写的问题,而不是其他假设场景。
-
同意,我的错。但我仍然无法弄清楚如何实现我所描述的问题和上面的评论。
标签: amazon-web-services terraform amazon-iam