使用Terraform创建S3 Bucket ACL时遇AccessDenied问题求助
问题描述
我尝试使用根账号及IAM用户创建S3 Bucket ACL,但均遭遇困难。以下是IAM用户对应的Terraform代码:
resource "aws_iam_policy_attachment" "s3_full_access" { name = "s3_full_access_attachment" policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess" users = ["iamadmin"] } resource "aws_s3_bucket" "My_bucket" { bucket = "my-test-bucket-for-vpc-endpoints" tags = { Name = "My bucket" } } resource "aws_s3_bucket_acl" "my_bucket_acl" { bucket = aws_s3_bucket.My_bucket.bucket acl = "public-read" } resource "aws_s3_object" "object" { bucket = aws_s3_bucket.My_bucket.bucket key = "curl.txt" source = "curl.txt" acl = "public-read" etag = filemd5("curl.txt") }
执行时持续报错:
│ Error: error creating S3 bucket ACL for my-test-bucket-for-vpc-endpoints: AccessDenied: Access Denied
解决方向
- 关闭账户级S3公共访问阻止:AWS默认启用账户级公共访问限制,即便IAM用户有
AmazonS3FullAccess权限,也无法设置公共ACL。需在S3控制台的「账户设置」中,关闭以下四项:- 阻止新的公共桶策略
- 阻止公共和跨账户访问(若桶有公共策略)
- 阻止新的公共ACL
- 阻止公共和跨账户访问(若桶有公共ACL)
- 等待权限生效:给IAM用户附加策略后,可能需要几分钟完成权限同步,避免立即执行Terraform导致权限未生效。
- 改用桶策略替代ACL:如果无法关闭公共访问阻止,可通过桶策略实现公共读权限,示例Terraform配置:
resource "aws_s3_bucket_policy" "my_bucket_policy" { bucket = aws_s3_bucket.My_bucket.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Principal = "*" Action = "s3:GetObject" Resource = "${aws_s3_bucket.My_bucket.arn}/*" } ] }) }
同时移除aws_s3_bucket_acl和aws_s3_object中的acl = "public-read"配置。
内容的提问来源于stack exchange,提问作者charles uneze
相关产品推荐
相关产品推荐

