You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化Terraform中aws_iam_role_policy_attachment的for_each嵌套表达式?

简化Terraform中aws_iam_role_policy_attachment的for_each表达式

问题背景

想要简化以下Terraform代码里aws_iam_role_policy_attachment.role_policy_attachments的for_each属性表达式,类似Python中嵌套字典推导式的简洁写法,但暂未找到对应的Terraform/HCL写法。

原Terraform代码:

locals {
  roles    = [<a list of aws_iam_role resource objects...>]
  policies = [
    "AmazonEC2ContainerRegistryReadOnly",
    "AmazonS3FullAccess",
    <...>
  ]
}

# Attach all policies to all roles
resource "aws_iam_role_policy_attachment" "role_policy_attachments" {
  for_each = { for role_policy in flatten([
    for role in local.roles : [
      for policy in local.policies : {
        role   = role.name
        policy = policy
      }
    ]
    ]) :
    "${role_policy.role}-${role_policy.policy}" => role_policy
  }

  role       = each.value.role
  policy_arn = "arn:aws:iam::aws:policy/${each.value.policy}"
}

对应的Python简洁写法:

for_each = {f"{role.name}-{policy}": {"role": role.name, "policy": policy} for role in roles for policy in policies}

简化方案

可以简化,Terraform 0.12及以上版本支持直接在for表达式中处理多集合的笛卡尔积,无需使用flatten函数,写法更贴近Python的推导式:

resource "aws_iam_role_policy_attachment" "role_policy_attachments" {
  for_each = {
    for role in local.roles, policy in local.policies :
    "${role.name}-${policy}" => {
      role   = role.name
      policy = policy
    }
  }

  role       = each.value.role
  policy_arn = "arn:aws:iam::aws:policy/${each.value.policy}"
}

说明

这种写法通过for role in local.roles, policy in local.policies直接生成角色与策略的笛卡尔积,同时一步完成键("${role.name}-${policy}")和对应值的构建,省去了原代码中嵌套列表生成后再flatten的步骤,代码结构更紧凑清晰,逻辑和Python的推导式完全对应。


内容的提问来源于stack exchange,提问作者palotasb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:30:41