Terraform中如何合并多个IAM策略为单个策略附加到角色
实现方案
你当前的逻辑是为每个用户名循环生成独立的托管策略再逐一附加,用户量稍大就会触发单IAM角色最多挂载10个托管策略的配额限制。最直接的解决方式是把所有用户的权限整合到同一份IAM策略文档中,仅生成1个托管策略,单次附加到目标角色即可,合并后权限逻辑和原实现完全一致,不会改变原有授权效果。
改造后的Terraform代码
variable "usernames" { type = list(string) default = ["xxx","yyyy","zzz"] } variable "account_id" { description = "AWS staging account id" type = string default = "1234567890" } # 生成单个合并后的策略文档,不再按用户循环 data "aws_iam_policy_document" "iam_authentication" { # 所有同action、同effect的权限合并到同一个statement,减少策略冗余 statement { effect = "Allow" actions = [ "rds-db:connect" ] resources = concat( # 遍历所有用户名生成对应的个人dbuser ARN [for username in var.usernames : format("arn:aws:rds-db:us-east-1:%s:dbuser:%s/%s", var.account_id, module.rds.yy_resource_id, username)], # 加上公共的team账号ARN [format("arn:aws:rds-db:us-east-1:%s:dbuser:%s/team", var.account_id, module.rds.yy_resource_id)] ) } } # 仅生成1个托管策略,不再按用户循环创建 resource "aws_iam_policy" "iam_policy" { name = "iam_authentication_dev_all_users" path = "/" policy = data.aws_iam_policy_document.iam_authentication.json } # 仅需1次策略附加,不会占用多个策略配额 resource "aws_iam_role_policy_attachment" "iam_policy_attach_to_role" { policy_arn = aws_iam_policy.iam_policy.arn role = "ABC" }
关键说明
- 改造后仅占用1个托管策略挂载位,哪怕后续用户名列表扩展到几十上百个,都不会触碰10个托管策略的配额限制
- 单条客户托管策略的最大容量为6KB(压缩后的JSON格式),足以承载数百个RDS连接权限的ARN配置,常规开发场景下不会触发单策略大小限制
- 后续新增、删除用户只需要修改
var.usernames变量列表,Terraform会自动更新对应策略内容,不需要调整策略挂载逻辑 - 所有授权逻辑和原代码完全等价:既保留了每个用户对应个人数据库账号的连接权限,也保留了公共team账号的连接权限
- 如果后续需要给这个角色加其他权限,只需要在同一个
aws_iam_policy_document块内新增对应的statement配置即可,始终保持单策略附加,不会额外占用配额
内容的提问来源于stack exchange,提问作者user_01_02
相关产品推荐
相关产品推荐

