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

如何在Terraform中为多IAM角色配置不同S3权限策略?

解决Terraform中为每个S3桶ARN单独添加/*后缀的问题

你的问题出在var.roles的变量类型上——当前每个角色对应的value是逗号分隔的字符串,不是列表。这导致each.value是一整个字符串,你给它加/*只会在整个字符串末尾拼接,而不会作用到每个ARN上。

修复步骤:

  1. 修改变量类型为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]
  }
}
  1. *生成包含原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:06:32