使用AWS API Gateway与Lambda时的CORS预检请求问题求助
解决AWS API Gateway + Lambda的CORS预检403错误
关键排查步骤
1. 确认API Gateway已重新部署
每次修改CORS配置或OPTIONS方法后,必须将API重新部署到目标阶段:
- 登录API Gateway控制台,选中你的API
- 点击顶部的部署API按钮
- 选择对应的部署阶段(如
prod),完成部署 - 注意:未部署的配置不会生效,这是最常见的遗漏点
2. 验证OPTIONS方法的Mock集成配置
确保OPTIONS方法的方法响应和集成响应完全正确:
- 方法响应:
- 选择200状态码,添加以下响应头:
Access-Control-Allow-Origin:值设为*或你的网站域名Access-Control-Allow-Methods:值设为POST, OPTIONS(包含实际使用的方法)Access-Control-Allow-Headers:值设为Content-Type, X-Requested-With(匹配前端请求的头)
- 选择200状态码,添加以下响应头:
- 集成响应:
- 选择200状态码,设置
application/json映射模板为{}(空JSON对象即可) - 确保集成响应的头映射正确关联到方法响应的头
- 选择200状态码,设置
3. 检查API Gateway资源策略
如果你的API配置了资源策略,可能限制了预检请求的来源:
- 进入API Gateway控制台的资源策略页面
- 检查策略中是否有
Condition限制了aws:Referer或aws:Origin - 暂时移除策略(或添加你的网站域名到允许列表),测试是否解决问题
4. 验证Lambda执行角色与API Gateway调用权限
403错误可能是权限不足导致:
- Lambda执行角色:确保角色附带
AWSLambdaBasicExecutionRole权限(用于日志输出),以及处理邮件所需的其他权限(如SES) - API Gateway调用权限:在Lambda控制台的配置->触发器中,检查API Gateway触发器是否存在且权限配置正确
- 如果触发器缺失,重新添加API Gateway作为触发器,自动生成调用权限
5. 修正Lambda的OPTIONS请求处理逻辑
确保Lambda能正确处理OPTIONS请求,返回标准CORS头:
示例Node.js代码:
exports.handler = async (event) => { if (event.httpMethod === 'OPTIONS') { return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'POST, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }, body: JSON.stringify({}) }; } // 处理POST请求的逻辑 if (event.httpMethod === 'POST') { // 你的邮件发送逻辑 return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify({ message: 'Success' }) }; } return { statusCode: 405, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify({ error: 'Method not allowed' }) }; };
- 注意:OPTIONS请求必须返回200状态码,且头信息完整,不要包含额外的业务逻辑
6. 用curl手动测试预检请求
通过curl模拟浏览器的预检请求,查看响应头和状态码:
curl -X OPTIONS \ -H "Origin: https://your-website-domain.com" \ -H "Access-Control-Request-Method: POST" \ -H "Access-Control-Request-Headers: Content-Type" \ -v https://example-api.execute-api.eu-central-1.amazonaws.com/EmailResource
- 检查响应中是否包含正确的CORS头,以及状态码是否为200
- 如果返回403,查看响应中的
x-amzn-ErrorType字段,获取具体错误原因
7. 查看CloudWatch日志定位问题
- API Gateway日志:在API Gateway控制台的阶段->日志记录/Tracing中,启用CloudWatch日志,查看预检请求的详细流程
- Lambda日志:在Lambda控制台的监控->日志中,检查OPTIONS请求是否被正确触发,是否有报错信息
内容的提问来源于stack exchange,提问作者ozim
相关产品推荐
相关产品推荐

