如何为CloudFront+API Gateway后的Lambda签名AWS SigV4请求?
解决方案
方法1:将CloudFront域名配置为API Gateway的自定义域名
- 在API Gateway控制台中,为目标API添加自定义域名
john.dev.project.io,关联对应的API部署阶段。 - 修改CloudFront的源地址,将原来的
api.dev.project.io替换为API Gateway自定义域名对应的访问地址。 - 前端请求时,直接基于
john.dev.project.io生成AWS签名,此时请求的Host头与API Gateway期望的一致,签名验证可正常通过。
方法2:配置CloudFront转发原始Host头并开放API Gateway域名白名单
- 创建CloudFront的Origin Request Policy,确保转发请求的
Host头(可选择包含Host的预设策略,或自定义策略添加Host字段)。 - 在API Gateway的API设置页面,将
john.dev.project.io添加到允许的域名列表中,让API Gateway接受该Host头的请求。 - 前端基于
john.dev.project.io生成签名,CloudFront将原始Host头转发给API Gateway,此时签名计算的Host与API Gateway接收的Host匹配,验证通过。
方法3:让CloudFront作为中间层处理IAM认证(适用于复杂架构)
- 为CloudFront配置Lambda@Edge函数,在请求到达时验证前端的AWS签名。
- 为CloudFront的Origin Access Identity(OAI)或关联的IAM角色授予访问目标API Gateway的权限。
- 前端对CloudFront域名生成签名,CloudFront验证通过后,用自身权限访问API Gateway,此时API Gateway只需信任CloudFront的请求,无需直接验证前端签名。
关键注意点
- AWS签名计算必须包含请求的实际Host头,因此前端签名的目标域名必须与API Gateway最终接收的Host头一致。
- 浏览器无法修改Host头,必须通过架构调整让前端请求域名与API Gateway认可的Host头匹配,或通过代理层转发逻辑对齐两者。
内容的提问来源于stack exchange,提问作者Emile Haas
相关产品推荐
相关产品推荐

