配置S3存储桶策略遇AccessDenied报错:已赋权限仍无法解决
排查S3存储桶策略配置403 AccessDenied报错的可能原因
可能的原因及修复方案
1. 公共访问块配置顺序颠倒
你的aws_s3_bucket_public_access_block资源设置了依赖于aws_s3_bucket_policy,这会让Terraform先尝试写入公共桶策略,再关闭公共访问限制。但S3默认的公共访问设置中,block_public_policy通常是开启状态,此时直接写入包含Principal: "*"的公共策略会被拦截,触发403错误。
修复:调整依赖顺序,先关闭公共访问限制,再设置桶策略:
resource "aws_s3_bucket_public_access_block" "s3-static-bucket-public-access-block" { bucket = aws_s3_bucket.s3-static-bucket.id block_public_acls = false block_public_policy = false ignore_public_acls = false restrict_public_buckets = false } resource aws_s3_bucket_policy s3-static-bucket { bucket = aws_s3_bucket.s3-static-bucket.bucket policy = data.template_file.s3-static-policy_1.rendered # 依赖公共访问块配置完成 depends_on = [ aws_s3_bucket_public_access_block.s3-static-bucket-public-access-block ] }
2. IAM权限存在隐性限制
即便你已添加s3:GetBucketPolicy和s3:PutBucketPolicy权限,仍需排查:
- 权限是否带有条件约束(比如限制了访问IP、资源ARN不匹配)
- 账号是否存在服务控制策略(SCP),禁止了S3公共策略的写入操作
- 当前IAM身份是否是桶的所有者,或被桶所属账号明确授予了跨账号策略操作权限(如果桶属于其他AWS账号)
3. 所有权控制配置时机不合理
aws_s3_bucket_ownership_controls设置为BucketOwnerPreferred,虽不直接影响策略写入,但建议将其放在桶创建后、策略写入前完成,确保所有权配置生效:
resource "aws_s3_bucket_ownership_controls" "example" { bucket = aws_s3_bucket.s3-static-bucket.id rule { object_ownership = "BucketOwnerPreferred" } } resource aws_s3_bucket_policy s3-static-bucket { bucket = aws_s3_bucket.s3-static-bucket.bucket policy = data.template_file.s3-static-policy_1.rendered depends_on = [ aws_s3_bucket_public_access_block.s3-static-bucket-public-access-block, aws_s3_bucket_ownership_controls.example ] }
4. 桶策略模板硬编码问题
你的policy.json.tpl中资源ARN是硬编码的arn:aws:s3:::test-static3/*,若后续修改桶名会导致不匹配。建议改用模板变量动态生成:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::${bucket}/*" ] } ] }
内容的提问来源于stack exchange,提问作者AnthonyAR
相关产品推荐
相关产品推荐

