使用Terraform创建S3 Bucket时遇到AccessDenied权限错误
问题描述
我编写了一份简单的Terraform配置文件main.tf,内容如下:
provider "aws" { region = "eu-central-1" # Set your desired region } locals { bucket_name = "noname-production-default-storage" } resource "aws_s3_bucket" "noname-production-s3" { bucket = local.bucket_name } resource "aws_s3_bucket_policy" "noname-s3-policy" { bucket = aws_s3_bucket.noname-production-s3.id policy = jsonencode({ Version = "2012-10-17", Statement = [ { Sid = "PublicReadGetObject", Effect = "Allow", Principal = "*", Action = "s3:GetObject", Resource = "arn:aws:s3:::${local.bucket_name}/*" } ] }) }
执行该配置时出现错误:
Error: putting S3 policy: AccessDenied: Access Denied
我的IAM用户已配置如下全权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*", "s3-object-lambda:*" ], "Resource": "*" } ] }
请问我缺少哪些必要权限?或是我的Terraform配置存在问题?
问题排查与解决
可能的原因及对应方案
账户级公共访问限制拦截
AWS默认启用S3账户级公共访问阻止设置,若开启了「阻止新的公共存储桶策略」等相关选项,即使IAM用户有全权限,也无法设置允许公共访问的Bucket Policy。
解决:- 登录AWS控制台,进入S3服务的「访问管理」-「公共访问设置」,临时关闭相关公共访问阻止选项后再执行Terraform
- 或在Terraform中添加资源直接禁用这些限制:
resource "aws_s3_account_public_access_block" "disable_public_block" { block_public_acls = false block_public_policy = false ignore_public_acls = false restrict_public_buckets = false }Bucket名称全球冲突
S3桶名是全球唯一的,若noname-production-default-storage已被其他AWS账户占用,实际创建的桶可能不符合预期,导致设置Policy时权限报错。
解决:更换唯一桶名,比如添加账户ID或自定义前缀。IAM隐性权限限制
虽IAM策略显示全权限,但可能存在隐性限制:- 检查IAM用户的权限边界(Permission Boundary),确认是否允许
s3:PutBucketPolicy操作 - 若为组织内账户,需确认**服务控制策略(SCP)**是否拦截了S3相关权限操作,联系管理员核查配置
- 检查IAM用户的权限边界(Permission Boundary),确认是否允许
Terraform配置优化点
当前Bucket Policy的Resource字段使用本地变量,可改为引用桶资源的ARN,避免名称不一致问题:Resource = "${aws_s3_bucket.noname-production-s3.arn}/*"
内容的提问来源于stack exchange,提问作者Philipp S.
相关产品推荐
相关产品推荐

