使用CloudFront分发S3静态内容失败,请求排查配置问题
CloudFront 搭配 S3 托管静态内容无法访问问题排查与修复
问题描述
我尝试配置CloudFront与S3来托管网站的静态内容,但目前无法正常工作,操作步骤如下:
- 创建了禁用所有公共访问的S3存储桶
men-mvc-local - 创建CloudFront分发,选择该S3存储桶作为源域名
- AWS控制台提示需手动更新存储桶策略(针对OAC),于是添加了如下存储桶策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipalReadWrite", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::men-mvc-local/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::xxxx-9609-xxxx:distribution/E1L6NWB7YV5XXX" } } }
- 尝试通过CloudFront URL访问文件:
https://dl2j5zcr9xpi4.cloudfront.net/my-image.png,但无法看到图片。
问题分析与修复方案
1. 修复存储桶策略语法错误
你的JSON策略存在语法不完整问题:Statement数组缺少闭合的],整个策略对象缺少闭合的},导致策略无法生效。同时,托管静态内容仅需s3:GetObject权限,可移除不必要的s3:PutObject。修正后的完整策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipalRead", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::men-mvc-local/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::xxxx-9609-xxxx:distribution/E1L6NWB7YV5XXX" } } } ] }
2. 确认Origin Access Control (OAC) 关联状态
创建CloudFront分发时,必须确保已启用并关联OAC到S3源:
- 进入CloudFront分发的「源」设置页面,检查是否已选择对应的OAC
- 若创建分发时未配置OAC,需编辑源,创建新的OAC并完成关联,再重新应用上述存储桶策略
3. 验证文件路径与存在性
- 确认S3存储桶内确实存在
my-image.png,注意S3路径区分大小写,需保证文件名、层级完全匹配 - 检查CloudFront分发的「源路径」是否留空(若设置了自定义路径,需确保访问URL与源路径匹配)
4. 刷新CloudFront缓存
修改存储桶策略或源配置后,CloudFront可能缓存旧的错误响应,需手动触发缓存刷新:
- 进入CloudFront控制台,选择对应分发,切换到「Invalidations」标签
- 创建新的Invalidation,路径填写
/*(刷新所有内容)或/my-image.png(仅刷新目标文件),等待刷新完成(通常需1-5分钟)
5. 排查错误状态码
打开浏览器开发者工具(F12),查看网络请求的状态码:
- 403 Forbidden:优先检查存储桶策略是否生效、OAC是否正确关联
- 404 Not Found:确认文件路径正确性,或检查S3存储桶区域与CloudFront的同步情况
内容的提问来源于stack exchange,提问作者Wai Yan Hein
相关产品推荐
相关产品推荐

