如何在Terraform中为多IAM角色配置不同S3权限策略?
解决Terraform中为每个S3桶ARN单独添加/*后缀的问题
你的问题出在var.roles的变量类型上——当前每个角色对应的value是逗号分隔的字符串,不是列表。这导致each.value是一整个字符串,你给它加/*只会在整个字符串末尾拼接,而不会作用到每个ARN上。
修复步骤:
- 修改变量类型为map(list),让每个角色对应一个ARN列表,而不是字符串:
variable "roles" { type = map(list(string)) default = { # 每个角色对应一个ARN列表 "TestRole1" = [module.s3_bucket_raw.s3_bucket_arn, module.s3_bucket_bronze.s3_bucket_arn] "TestRole2" = [module.s3_bucket_bronze.s3_bucket_arn, module.s3_bucket_silver.s3_bucket_arn] } }
- *生成包含原ARN和带/后缀的资源列表:
用Terraform的flatten和for表达式,遍历每个ARN,同时生成原ARN和ARN/*两种格式,最后合并成一个扁平列表:
resource "aws_iam_role" "example" { for_each = var.roles name = each.key assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = [ "s3:PutObject", "s3:GetObject", "s3:ListBucket", "s3:GetBucketAcl", "s3:DeleteObject", "s3:GetBucketLocation" ] Effect = "Allow" # 遍历每个ARN,生成原ARN和带/*的版本,再扁平化 Resource = flatten([ for arn in each.value : [arn, "${arn}/*"] ]) } ] }) }
效果说明:
这样处理后,每个角色的Resource列表会包含:
- 原S3桶ARN(用于ListBucket等桶级操作)
- 每个ARN对应的
ARN/*(用于对象级操作)
完全符合你需要的每个ARN都单独添加/*后缀的需求。
内容的提问来源于stack exchange,提问作者Ali Mohsan
相关产品推荐
相关产品推荐

