CloudFront分发权限异常:无法自动授予S3存储桶读取权限
解决CloudFront分发无法自动更新S3桶策略的问题
我之前也碰到过一模一样的情况!当你选择“Yes, Update Bucket Policy”却自动跳回“No”,大概率是当前操作的IAM用户/角色没有足够权限修改S3桶策略,或者你的桶策略已经存在冲突规则,导致CloudFront无法自动生成并写入新策略。别担心,咱们手动配置就能搞定,步骤很清晰:
1. 确认IAM权限(可选但重要)
如果想让CloudFront以后能自动更新策略,得确保你用来创建分发的IAM实体(用户/角色)拥有s3:PutBucketPolicy权限。可以检查对应的IAM策略里是否包含类似这样的语句:
{ "Effect": "Allow", "Action": "s3:PutBucketPolicy", "Resource": "arn:aws:s3:::你的桶名称" }
如果没有,就给它加上——不过如果暂时不想调整IAM权限,直接手动配置桶策略也完全可行。
2. 手动添加CloudFront访问S3的桶策略
既然自动更新走不通,咱们直接给S3桶添加正确的策略,让CloudFront的Origin Access Identity(OAI)或者Origin Access Control(OAC)能读取桶内对象:
情况A:使用OAI(旧版,仍广泛应用)
- 先进入你的CloudFront分发配置,找到Origin Settings下的Origin Access Identity,复制它的ARN(格式通常为
arn:aws:cloudfront::123456789012:user/CloudFront Origin Access Identity XXXXXXXXXXXX) - 打开S3桶的Permissions -> Bucket Policy,粘贴以下策略并替换占位符:
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "你的OAI ARN" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的桶名称/*" } ] }
情况B:使用OAC(新版推荐)
- 先复制OAC的ARN(格式类似
arn:aws:cloudfront::123456789012:origin-access-control/oac-XXXXXXXXXXXX) - 在S3桶的Bucket Policy中粘贴以下策略,替换占位符:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的桶名称/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/你的CloudFront分发ID" } } } ] }
3. 检查桶的Block Public Access设置
因为你提到已经限制了桶级访问,要确保以下设置不会阻止CloudFront的访问:
- 不要勾选“Block all public access”(如果勾选,CloudFront的OAI/OAC也会被拦截)
- 确保“Block public access to buckets and objects granted through any access control lists (ACLs)”和“Block public access to buckets and objects granted through new public bucket policies”的设置不会和咱们刚才添加的策略冲突——一般来说,只要使用OAI/OAC,这两项可以保持开启,因为CloudFront的访问不属于“公开访问”范畴。
4. 验证访问
保存桶策略后,等待几分钟让策略生效,然后用CloudFront的域名访问S3内的对象,应该就能正常访问了。
内容的提问来源于stack exchange,提问作者Punter Vicky
相关产品推荐
相关产品推荐

