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

如何在Terraform中循环为AWS组配置多个Permission Set(解决多权限集仅生效单个的问题)

解决Terraform中为AWS组配置多个Permission Set的问题

我看到你遇到的问题了——当给一个组指定多个Permission Set时,只有最后一个会生效,而且最终只创建了一个账号分配资源。这是因为你的代码里有两个关键问题需要修正:

1. 修正Local变量中的重复键问题

你在local.dev的第一个组里重复定义了permission_sets_cloudops键:

"permission_sets_cloudops" = local.aws_poweruser
"permission_sets_cloudops" = local.aws_administrator

在HCL里,对象中重复的键会被后面的覆盖,所以这个组实际上只有local.aws_administrator这一个权限集,而不是两个。

要解决这个,需要把permission_sets_cloudops改成列表类型,这样就能容纳多个权限集了:

locals {
  dev = [{
    "groupname" = "role-aws-cloudops-developers",
    "permission_sets_cloudops" = [local.aws_poweruser, local.aws_administrator]
  }, {
    "groupname" = "role-aws-cloudops-viewers",
    "permission_sets_cloudops" = [local.tf_viewer]
  }]
}

2. 遍历每个Permission Set生成账号分配

现在你的module里account_assignments只生成了单个对象,没有遍历组内的多个权限集。我们需要用flatten和嵌套for循环来为每个权限集生成独立的账号分配项:

module "sso_account_assignments_cloudops_sandbox" {
  source = "./modules/account-assignments"
  # 用更具唯一性的键(索引+组名)避免冲突
  for_each = { 
    for idx, group in local.dev : 
    "${idx}-${group.groupname}" => group 
  }

  account_assignments = flatten([
    # 遍历当前组的所有权限集,生成对应的账号分配对象
    for permission_set in each.value.permission_sets_cloudops : {
      account = var.accounts.SL.Sandbox
      permission_set_arn = permission_set
      principal_type = "GROUP"
      principal_name = each.value.groupname
    }
  ])
}

为什么这样修改能生效?

  • flatten函数会把嵌套的数组(每个权限集生成一个数组项)合并成一个一维数组,确保每个权限集对应一个独立的account_assignment对象。
  • 修改for_each的键为${idx}-${group.groupname},保证每个组的实例唯一,避免潜在的命名冲突。

验证修改后的效果

运行terraform plan后,你应该会看到3个资源被创建:

  • role-aws-cloudops-developers组的两个Permission Set各对应一个账号分配
  • role-aws-cloudops-viewers组的一个Permission Set对应一个账号分配

这样就能实现为每个组配置所有声明的Permission Set了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:48:16