配置AWS CloudFront关联S3桶后无法访问EC2后端的问题咨询
问题排查与补充配置步骤
1. 为后端EC2添加CloudFront源和行为规则
你当前的CloudFront分发仅配置了S3作为唯一源,前端的API请求(比如/api/*)会被默认路由到S3而非EC2后端,这是核心问题之一。需要补充以下配置:
- 新增EC2源:
- Origin type选择
Custom Origin - Origin domain填写EC2的弹性IP(避免公网IP变动)或公网域名
- Origin protocol policy根据后端服务协议选择
HTTP only或Match viewer - 端口填写后端服务的运行端口(如3001)
- Origin type选择
- 新增API路由行为:
- Path pattern设置为
/api/*(匹配你的后端接口前缀) - Origin或源组选择刚创建的EC2源
- Viewer protocol policy推荐设为
HTTPS only - Cache policy选择
Managed-CachingDisabled(API请求不适合缓存,防止返回旧数据) - 确保该行为的优先级高于默认行为(优先级数值更小)
- Path pattern设置为
2. 配置EC2后端的CORS规则
前端从CloudFront域名发起请求时会触发跨域检查,需在Node.js后端添加CORS配置,允许CloudFront域名访问:
// 示例:使用cors包配置 const cors = require('cors'); app.use(cors({ origin: 'https://你的CloudFront域名.cloudfront.net', credentials: true // 若需要携带Cookie或认证信息则开启 }));
若未使用cors包,可手动设置响应头:
app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', 'https://你的CloudFront域名.cloudfront.net'); res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); if (req.method === 'OPTIONS') { return res.sendStatus(200); } next(); });
3. 验证S3源的配置一致性
你同时启用了S3静态网站托管和OAC,需确认:
- CloudFront源的域名使用S3静态网站托管端点(格式:
bucket-name.s3-website-region.amazonaws.com),而非S3 REST API域名(bucket-name.s3.amazonaws.com),否则静态网站的索引页、重定向设置可能失效。 - 关闭S3的「阻止公共访问」设置(控制台「权限」>「阻止公共访问」),使用OAC时无需依赖ACL公开,避免权限冲突。
4. 确认EC2后端的可访问性
- 检查后端服务是否绑定
0.0.0.0而非localhost,否则仅能在EC2内部访问:netstat -tulpn | grep 3001 - 验证EC2网络ACL规则:确保入站规则允许3001端口,出站规则允许响应流量(默认网络ACL通常允许所有,若自定义过需确认)。
- 直接从本地访问EC2的后端接口(如
http://EC2公网IP:3001/api/xxx),确认服务本身运行正常。
5. 启用CloudFront日志排查错误
开启CloudFront标准日志,定位请求失败的具体原因:
- 在CloudFront分发的「监控」>「日志」中,开启标准日志并指定存储日志的S3桶。
- 等待10-15分钟后查看日志,根据错误码(如403、502)和源信息排查问题。
内容的提问来源于stack exchange,提问作者jason_coder
相关产品推荐
相关产品推荐

