AWS CloudFront访问S3存储桶遇403拒绝问题求助
问题概述
- 在us-west-2区域创建默认配置的S3存储桶,上传单个index.html文件
- 配置CloudFront分发:使用Origin Access Control(OAC),设置默认根对象为
index.html,添加自定义域名,复制CloudFront生成的桶策略到S3桶权限中 - 完成配置并等待分发生效、执行缓存失效后,访问CloudFront分发域名持续返回403 AccessDenied错误;同根账号下的另一个账户执行完全相同步骤可正常访问
- 桶已启用Bucket Owner Enforced对象所有权,仅支持通过桶策略控制访问
- 尝试过开启公共访问、修改策略为"允许所有"等操作,均无效;CloudWatch日志仅显示"Access Denied"
错误响应示例:
<Error> <Code>AccessDenied</Code> <Message>Access Denied</Message> <RequestId>******</RequestId> <HostId>iY6PE****</HostId> </Error>
CloudFront生成的桶策略:
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::mybucket-123/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::*****:distribution/*****" } } } ] }
排查与解决方案
1. 验证Origin Access Control(OAC)配置
- 进入CloudFront分发的Origin配置页,确认关联的OAC设置正确:
- OAC的Origin type必须为
S3 - 必须勾选
Sign requests(需确认已修正之前"Do not sign requests"的错误选择)
- OAC的Origin type必须为
- 若OAC为手动创建,检查其设置:需选择
S3作为源类型,签名版本选Signature Version 4
2. 确认CloudFront Origin Domain的正确性
- 确保CloudFront的Origin domain选择的是S3桶的REST API域名(格式:
bucket-name.s3.us-west-2.amazonaws.com),而非S3静态网站托管域名(格式:bucket-name.s3-website-us-west-2.amazonaws.com) - OAC仅支持通过S3 REST API域名访问,使用静态网站域名会导致签名失效,触发403
3. 校验桶策略中的SourceArn匹配度
- 复制CloudFront分发的完整ARN(在分发详情页General标签下获取,格式:
arn:aws:cloudfront::AWS_ACCOUNT_ID:distribution/DISTRIBUTION_ID) - 对比桶策略中
Condition.StringEquals.AWS:SourceArn的值,确保完全一致,无账号ID、分发ID的拼写错误
4. 检查对象所有权与桶策略覆盖范围
- 确认index.html的所有者是桶的所有者(在S3对象详情Permissions标签下查看),Bucket Owner Enforced模式下桶所有者自动拥有对象所有权,无需额外配置对象ACL
- 桶策略中的
Resource为arn:aws:s3:::mybucket-123/*,已覆盖所有对象,无需调整
5. 确认CloudFront分发状态与缓存失效
- 检查CloudFront分发状态是否为Deployed(生效需等待15-30分钟)
- 执行缓存失效时,设置失效路径为
/*,确保所有缓存内容被清除
6. 检查S3桶的公共访问设置
- 确保S3桶的Block all public access处于开启状态(OAC模式下无需公开桶或对象,开启公共访问阻止可避免配置冲突)
- 若之前调整过公共访问设置,确认桶策略中无残留的拒绝公共访问的语句
7. 验证CloudFront默认根对象配置
- 确认CloudFront分发的Default root object设置为
index.html(无前置斜杠) - 访问分发域名时直接访问根路径(如
https://d1d*****.cloudfront.net),而非带文件名的路径
8. 检查跨账号权限(针对同根账号下的账户差异)
- 若当前账户为根账号下的IAM用户/角色,确认该身份拥有
cloudfront:CreateDistribution、s3:PutBucketPolicy等完整权限 - 对比正常工作的账户权限配置,排除因权限不足导致的配置遗漏
内容的提问来源于stack exchange,提问作者Bostone
相关产品推荐
相关产品推荐

