在Lambda函数中获取AWS CloudFront HTTP Headers的问题求助
问题描述
我在AWS上创建API(REST或HTTP类型)并指向Lambda函数,目的是让Lambda能获取CloudFront的HTTP头,尝试了两种配置都存在问题:
- 配置CloudFront分发指向以Lambda为路由的HTTP API,使用了包含CloudFront头的源请求策略,但Lambda打印的请求里完全看不到CloudFront头。
- 换成REST API做相同配置,只能拿到
CloudFront-Viewer-Country和CloudFront-Viewer-ASN这两个头,其他配置的CloudFront头都获取不到。
解决方案
1. 校验源请求策略与CloudFront基础配置
确保源请求策略明确勾选了所有需要传递的CloudFront头,且该策略已绑定到CloudFront分发对应的源上。另外,部分地理类CloudFront头(如城市、经纬度)需要CloudFront分发启用GeoIP功能才能生成,先检查该配置是否开启。
2. HTTP API的头传递配置
HTTP API默认会过滤未声明的请求头,需手动在集成请求中添加映射:
- 进入HTTP API的集成设置,选择「修改集成请求」
- 在「请求头」区域,添加所有需要传递的CloudFront头,格式为
{头名称}: $request.header.{头名称},例如CloudFront-Viewer-City: $request.header.CloudFront-Viewer-City - 保存后重新部署API
3. REST API的头传递补充配置
REST API仅默认保留少量CloudFront头,其余需手动配置:
- 进入REST API的对应资源方法配置,切换到「集成请求」标签
- 展开「HTTP头」设置,点击「添加头」,输入目标头名称(如
CloudFront-Viewer-City),映射值设为method.request.header.CloudFront-Viewer-City - 同时在「方法请求」的「HTTP请求头」中添加对应条目,否则API Gateway会过滤未声明的头
4. Lambda端的头读取注意事项
- HTTP API会将所有头名称转为小写,需通过
event.headers['cloudfront-viewer-city']这类格式读取 - REST API保留头名称原大小写,可直接通过
event.headers['CloudFront-Viewer-City']读取,部分地理信息也可从event.requestContext.identity.cloudFront中获取
5. 清除CloudFront缓存
若之前存在旧缓存,可能导致新的头配置不生效:
- 手动清除CloudFront分发的缓存
- 测试时携带
Cache-Control: no-cache请求头,避免命中旧缓存
内容的提问来源于stack exchange,提问作者user1763510
相关产品推荐
相关产品推荐

