Terraform中为不同资源复用IAM策略公共语句的方法
可落地的复用方案
你判断的没错,source_policy_documents和override_policy_documents的逻辑是整段策略合并、同SID语句整段替换,不支持单语句的局部字段覆写,不用在这两个参数上耗时间。
最轻量化、不需要额外写子模块的实现方式是用本地公共变量+for_each批量生成,完全消除重复配置:
- 先把所有重复的公共配置、需要差异化传入的资源列表统一定义到本地值里
- 用for_each遍历目标资源列表,批量生成所有
aws_iam_policy_document数据块,公共语句只需要写一次,迭代时传入对应资源即可
示例配置如下:
locals { # 定义所有需要绑定公共权限的S3桶ARN,后续新增桶直接加在这里就行 s3_targets = { bucket_one = "arn:aws:s3:::bucket-one" bucket_two = "arn:aws:s3:::bucket-two" } # 抽离公共的权限动作列表,后续权限调整只需要改这一处 common_s3_rw_actions = [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:GetBucketAcl", "s3:GetBucketLocation" ] } data "aws_iam_policy_document" "s3_rw_access" { for_each = local.s3_targets # 这里放每个策略独有的自定义语句,可以根据each.key做差异化判断 # statement { # sid = "OtherCustomPermission" # actions = ["s3:ListAllMyBuckets"] # resources = ["*"] # } # 公共S3权限语句,只写一次,自动给每个桶生成对应配置 statement { sid = "example" actions = local.common_s3_rw_actions resources = [each.value] } }
后续引用对应策略时,直接按key取值即可:
- 桶1的策略JSON:
data.aws_iam_policy_document.s3_rw_access["bucket_one"].json - 桶2的策略JSON:
data.aws_iam_policy_document.s3_rw_access["bucket_two"].json
如果不同策略的自定义语句差异极大,不适合批量遍历生成,也可以只把公共动作列表抽为本地值,在各个单独的policy块里直接引用local.common_s3_rw_actions,至少可以消除动作列表的重复配置,后续调整权限不需要逐个块修改。
如果需要跨多个根模块、多个项目复用这段权限逻辑,再考虑把这段逻辑封装为极简的Terraform子模块,入参设为s3_bucket_arns和自定义语句列表,输出对应的策略JSON即可,单项目内用上面的本地方案维护成本最低。
内容的提问来源于stack exchange,提问作者iamanox
相关产品推荐
相关产品推荐

