调用CloudFront返回403错误,但关联的API Gateway URL可正常访问
解决CloudFront + API Gateway自定义域名的403错误
看起来你已经把EB和API Gateway的链路跑通了,就差CloudFront这最后一步踩了403的坑——这种情况我碰到过好多次,大概率是CloudFront和API Gateway的配置衔接出了问题,咱们一步步排查:
1. 先核对CloudFront的Origin核心配置
这是最容易出错的地方:
- Origin Domain Name:必须填API Gateway的官方执行域名(比如
xxxx.execute-api.us-east-1.amazonaws.com),别填你的自定义域名!要是填反了,相当于CloudFront循环转发,直接就403了。 - Origin Protocol Policy:一定要设为
HTTPS Only,API Gateway不接受HTTP请求,选别的都会导致转发失败。 - Origin Path:如果你的API Gateway自定义域名做了基础路径映射(比如把
your-domain.com映射到API的/prod阶段),那这里要填对应的路径(比如/prod)。不然CloudFront会把your-domain.com/users/1直接转发到API Gateway的/users/1,而如果你的API实际路径是/prod/users/1,自然就找不到资源了。
2. 检查CloudFront缓存行为的关键设置
缓存行为里的权限和规则经常导致403:
- Allowed HTTP Methods:至少要包含
GET(你当前用的请求方法),建议直接选GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE全覆盖,避免后续加方法又踩坑。 - 缓存/请求策略:如果用的是自定义策略,很可能误过滤了API Gateway必需的请求头(比如
Host头,API靠它识别对应服务)。先试试用AWS托管的策略:缓存策略选CachingDisabled(先关掉CloudFront缓存,排查API本身的问题),源请求策略选AllViewerExceptHostHeader,看能不能解决。 - Restrict Viewer Access:这个选项要是开了(比如配置了签名URL/ Cookie),但你调用时没带签名,直接就403。如果没用到签名功能,务必把它设为
No。
3. 验证API Gateway的基础路径映射
你在API Gateway里配置自定义域名时,有没有把路径映射对?
- 登录API Gateway控制台,进入「自定义域名」页面,查看「基础路径映射」:要确保映射的API和阶段是正确的。比如你的API部署在
prod阶段,那如果映射路径填/,your-domain.com/users/1就会转发到API-GW-URL/prod/users/1;如果你的API本身没有prod前缀,那就要把映射路径设为空,或者调整CloudFront的Origin Path来匹配。
4. 确认SSL证书与域名解析
这部分出错也可能间接导致403:
- CloudFront的SSL证书必须是美国东部(弗吉尼亚北部)区域的ACM证书,CloudFront只认这个区域的证书,其他区域的证书没法用。还要确保证书状态是「已颁发」,并且覆盖了你的自定义域名。
- 检查CloudFront的「备用域名(CNAME)」是否准确添加了你的自定义域名,同时DNS解析(不管是Route 53还是第三方DNS)要指向CloudFront的分配域名,两者必须完全一致。
5. 翻日志找精准线索
如果上面的检查都没问题,就看日志定位:
- 打开CloudFront的访问日志(在分配的「日志」选项里配置S3存储桶),查看403请求的
sc-status、cs-uri-stem、x-cache等字段:如果x-cache显示Error from cloudfront,说明是CloudFront这边的问题;如果是Miss from cloudfront但API没返回,那看转发的路径对不对。 - 同时开启API Gateway的执行日志(在API的「阶段」设置里打开CloudWatch日志),看有没有收到CloudFront转发的请求:如果没收到,说明CloudFront没转发过去;如果收到了但返回403,看日志里的错误类型,比如是不是路径匹配错误。
小技巧:用curl排查请求细节
直接在终端跑curl -v https://your-custom-domain.com/users/1,看返回的头部信息:
- 如果是CloudFront返回的403,会有
Server: CloudFront的标识; - 如果是API Gateway返回的403,会有
x-amzn-ErrorType这类头部,能直接告诉你错误原因。
内容的提问来源于stack exchange,提问作者Hamed Minaee
相关产品推荐
相关产品推荐

