通过CloudFormation部署后Lambda函数无法正常工作的问题求助
问题描述
我正在构建一个基于API Gateway和Lambda(Node.js后端)的应用,后端用Express+Sequelize搭建,还没连接数据库。本地运行时访问端点能正常收到hello world响应,但通过CloudFormation部署堆栈后,代码已经传到S3,API和Lambda也显示更新完成,访问端点却报错:
502 Bad Gateway - "message": "Internal server error"
后端只有简单的文本响应,没有复杂逻辑,不知道该怎么排查:不确定是API Gateway的问题还是Lambda部署的问题,毕竟本地能正常运行;另外CloudFormation创建的API Gateway同时存在dev和Stage两个阶段,不清楚原因和是否会造成影响。附对应的CloudFormation YAML配置:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Storygraf backend API Globals: Function: Timeout: 3 Resources: ExpressApi: Type: AWS::Serverless::Api Properties: StageName: dev ExpressLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: s3://storygraf-backend/xxxx Handler: lambda.handler MemorySize: 512 Runtime: nodejs14.x Timeout: 30 Events: ProxyApiRoot: Type: Api Properties: RestApiId: Ref: ExpressApi Path: / Method: ANY ProxyApiGreedy: Type: Api Properties: RestApiId: Ref: ExpressApi Path: /{proxy+} Method: ANY
排查与解决方案
一、优先排查Lambda执行问题
- 查看CloudWatch日志:直接去CloudWatch Logs找到对应Lambda的日志组,检查是否有报错信息——比如依赖缺失(本地装了node_modules但部署时没打包进去)、handler路径错误、Node.js版本兼容问题等,这些是本地能跑但部署失败的常见原因。
- 直接测试Lambda:在Lambda控制台的「测试」标签页,选择API Gateway代理事件模板,模拟请求调用Lambda,看是否能正常返回响应。如果Lambda本身执行报错,问题就出在Lambda这边。
- 核对handler配置:确认YAML里的
Handler: lambda.handler和代码里的导出逻辑一致——比如用serverless-express适配Express到Lambda的话,是否在lambda.js里正确导出了exports.handler = serverlessExpress.proxy(serverlessExpress.createServer(app));。 - 统一超时设置:全局Function超时是3秒,但Lambda单独设了30秒,可能存在配置冲突,先把全局超时改成和Lambda一致试试。
二、排查API Gateway问题
- 确认访问的阶段URL:你配置里指定了
StageName: dev,访问时要确保用的是dev阶段的API URL,Stage阶段大概率是之前操作残留的,不要访问错了。 - 开启API Gateway日志:在API Gateway控制台的阶段设置里,开启CloudWatch日志,查看请求转发到Lambda的过程中是否有权限错误(比如API Gateway没有调用Lambda的权限)、映射模板错误等。
- 检查集成配置:确认API Gateway的代理集成是默认配置,不要自定义错误的请求/响应映射模板,避免因格式不兼容导致502错误。
三、关于两个API阶段的说明
dev是你在YAML里指定的阶段,CloudFormation会自动创建这个阶段并完成API部署。Stage阶段是历史操作残留的,不会影响正常使用,但建议清理掉避免混淆。你的Lambda事件是绑定到dev阶段的,所以必须访问dev阶段的URL才能触发Lambda。
内容的提问来源于stack exchange,提问作者Joshua Foxworth
相关产品推荐
相关产品推荐

