通过CloudFront访问第二个S3源时遇访问拒绝问题求助
问题原因及解决方案
1. 路径前缀未被剥离,S3中无对应资源
当访问/primary/*或/secondary/*路径时,CloudFront会将完整路径(包括/primary/前缀)转发到对应S3存储桶。如果你的S3桶内未创建primary/secondary文件夹,也没有对应路径的文件,S3会直接返回403访问拒绝。
解决方法:
- 方案一:在两个S3桶中分别创建
primary、secondary文件夹,将对应HTML文件放入匹配的文件夹内。 - 方案二:通过路径重写剥离前缀后再转发到S3:
- 使用Lambda@Edge的
Origin Request触发器编写代码移除路径前缀(例如把/primary/index.html转换为/index.html)。
- 使用Lambda@Edge的
2. 默认缓存行为指向故障转移源组
你配置的默认缓存行为target_origin_id为Origin_Group_S3,这个源组采用故障转移模式:只有当主源(第一个S3桶)返回403/404/500/502状态码时,才会切换到第二个桶。因此直接访问域名(触发默认行为)时,会优先加载第一个桶的index.html,这是当前配置的预期行为。若需默认行为访问其他内容,需调整默认缓存行为的target_origin_id。
3. 检查S3桶的OAI权限配置
虽然你为两个S3桶分别配置了OAI,但需确保每个OAI对应的S3桶政策正确授权CloudFront访问权限。示例政策(替换对应OAI ARN和桶名):
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity YOUR_OAI_ID" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*" } ] }
额外注意
修改配置后,需手动刷新CloudFront缓存(Invalidation),避免旧缓存规则影响新配置生效。
内容的提问来源于stack exchange,提问作者charles uneze
相关产品推荐
相关产品推荐

