【问题标题】:How use values of list terraform variable in aws_policy.arn如何在 aws_policy.arn 中使用列表 terraform 变量的值
【发布时间】: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


【解决方案1】:

您必须使用for_each 来创建您的策略,因为您无法按照您尝试的方式动态引用单个资源:

# get all policy names. Your names are unique, so its fine to use list
locals {
    policy_names = flatten(values(var.service_accounts)[*]["policies"])
}

# create policy for each name in `policy_names`
resource "aws_iam_policy" "policy" {
  
  for_each = local.policy_names

  name_prefix = "dev-policy"
  description = "some description"

  # similar must be done below
  # policy      = data.aws_iam_policy_document.dev-policy1.json
}

然后您将它们称为:

role_policy_arns              = [for i in each.value.policies: aws_iam_policy[${i}].arn]

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2021-09-24
    • 2021-07-06
    • 2023-02-22
    • 1970-01-01
    相关资源
    最近更新 更多