CloudFront分发访问被拒:按AWS文档配置S3桶策略仍无效
问题描述
我给S3桶配置了如下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipalReadOnly", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket-name-here/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::123456789:distribution/ASDFASDFASDF" } } } ] }
该策略取自AWS官方文档,我已启用CloudFront分发,且SourceArn与分发完全匹配,但所有访问尝试均返回访问被拒。目前仅能通过将桶设为公开并添加如下存在安全风险的策略,才能让CloudFront展示S3桶中的文件:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AddPerm", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket-name-here/*" } ] }
请问问题出在哪里?
问题排查与解决方案
1. Origin Access Control(OAC)配置不匹配
如果你的CloudFront分发使用的是新版OAC而非旧版OAI,当前桶策略的配置完全错误:
- OAC对应的
Principal应为"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Control <OAC-ID>",而非"Service": "cloudfront.amazonaws.com" - 条件键需指向OAC的ARN,不是CloudFront分发的ARN
2. S3公共访问设置阻止了权限
检查S3桶的Block Public Access设置:
- 如果开启了
Block all public access,会直接覆盖桶策略中的允许规则,导致CloudFront无法访问 - 只需关闭会影响CloudFront访问的选项(不需要全部关闭,保持其他公共访问限制即可)
3. CloudFront源配置错误
- 确认分发的源域名是S3桶的标准域名(如
bucket-name-here.s3.amazonaws.com),避免使用自定义域名或区域特定域名导致的权限验证失败 - 确认源配置中已正确关联OAI/OAC,且勾选了"Restrict Bucket Access"选项
4. ARN拼写或格式错误
仔细核对以下内容:
- S3桶ARN中的桶名是否与实际完全一致(注意大小写、特殊字符)
- CloudFront分发ARN中的账号ID、分发ID是否准确,没有多字符、少字符或大小写错误
5. 存在拒绝权限覆盖
检查是否有其他权限规则阻止了访问:
- 桶策略中是否存在
Deny语句,优先级高于Allow规则 - 关联的IAM角色/用户是否有拒绝
S3:GetObject的权限
内容的提问来源于stack exchange,提问作者eComEvo
相关产品推荐
相关产品推荐

