You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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状态码,设置application/json映射模板为{}(空JSON对象即可)
    • 确保集成响应的头映射正确关联到方法响应的头

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:05:27