在AWS SAM中配置CORS遇阻:全局配置后仍无法生效
解决SAM配置全局CORS不生效的问题
我之前也碰到过一模一样的SAM全局CORS配置不生效的坑,给你几个亲测有效的排查和解决方向:
1. 先确认你的SAM CLI版本是否支持全局CORS
全局CORS是从SAM CLI 1.10.0版本开始引入的,老版本根本不识别这个配置。先跑命令查版本:
sam --version
如果版本低于1.10.0,赶紧升级:
pip install --upgrade aws-sam-cli
别小看版本问题,我之前就是因为本地用了老版本,改了模板完全没效果,折腾了半天。
2. 修正全局CORS的语法错误
你写的Cors: "'*'"多了一层不必要的单引号嵌套,正确的写法分两种:
- 简单通配符配置(允许所有来源):
Globals: Api: Cors: "*" - 更严谨的多参数配置(推荐,适合生产环境):
Globals: Api: Cors: AllowOrigin: "'*'" AllowMethods: "'GET,POST,OPTIONS'" AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
注意这里的单引号是必须的,因为SAM会把这些值直接传递给API Gateway的CORS配置,需要作为字符串整体解析。
3. 必须处理OPTIONS请求!
即使API Gateway配置了CORS,如果你的Lambda函数没有正确响应OPTIONS预检请求,浏览器还是会报CORS错误。最简单的方式是在Lambda代码里加一个OPTIONS分支:
比如Python示例:
def lambda_handler(event, context): # 处理OPTIONS预检请求 if event["httpMethod"] == "OPTIONS": return { "statusCode": 200, "headers": { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET,POST,OPTIONS", "Access-Control-Allow-Headers": "Content-Type,Authorization" }, "body": "" } # 你的正常业务逻辑 return { "statusCode": 200, "headers": { "Access-Control-Allow-Origin": "*" }, "body": "Success!" }
如果用的是其他语言,逻辑是一样的:先判断请求方法,OPTIONS请求直接返回带CORS头的200响应。
4. 重新部署并验证配置
修改模板后,一定要彻底重新部署,不要用增量更新:
sam deploy
部署完成后,去AWS控制台的API Gateway里验证:
- 进入你的API -> 任意一个资源端点 -> 点击「操作」->「启用CORS」,看看弹出的配置是不是和你全局设置的一致
- 或者直接测试OPTIONS请求,用curl:
curl -X OPTIONS https://your-api-id.execute-api.region.amazonaws.com/Prod/your-endpoint -H "Origin: https://your-frontend-domain.com" -v
看响应头里有没有Access-Control-Allow-Origin等正确的CORS头。
5. 本地开发的话,用SAM Local测试
本地调试时,用sam local start-api启动服务,然后用curl测试OPTIONS请求,这样能快速排查本地配置是否生效,不用每次都部署到AWS。
内容的提问来源于stack exchange,提问作者K..
相关产品推荐
相关产品推荐

