如何在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
相关产品推荐
相关产品推荐

