NestJS部署到AWS Lambda+Serverless访问端点报Internal Server Error
NestJS 部署到 AWS Lambda 返回 500 错误排查与修复
你的配置存在几个直接导致运行失败的问题,按以下步骤修正即可:
1. 修正 serverless.ts 逻辑错误
你当前代码在顶层直接调用bootstrap(),会导致Lambda冷启动阶段异步初始化逻辑未被正确捕获,初始化失败直接触发500。修正后代码如下:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import serverlessExpress from '@vendia/serverless-express'; import { Handler, Context, Callback } from 'aws-lambda'; let cachedServer: Handler; async function bootstrapServer() { const app = await NestFactory.create(AppModule); // 所有全局配置(CORS、全局前缀、拦截器等)必须在init之前调用 // 例:app.enableCors() // 例:app.setGlobalPrefix('api') await app.init(); const expressInstance = app.getHttpAdapter().getInstance(); return serverlessExpress({ app: expressInstance }); } export const handler: Handler = async (event: any, context: Context, callback: Callback) => { // 仅冷启动时初始化服务,后续请求复用缓存实例 if (!cachedServer) { cachedServer = await bootstrapServer(); } return cachedServer(event, context, callback); };
注意:必须删除原代码中顶层的bootstrap();调用,所有初始化逻辑收敛到handler内部的冷启动判断中。
2. 修正 serverless.yaml 打包配置错误
你当前配置的patterns写了!node_modules/**,等于把所有依赖包全部排除在部署包之外,Lambda运行时找不到任何第三方依赖会直接崩溃。修正后配置如下:
service: prism-backend frameworkVersion: '3' useDotenv: true plugins: - serverless-offline # 如需自动编译TS可添加该插件,跳过手动build步骤 # - serverless-plugin-typescript provider: name: aws runtime: nodejs14.x region: ap-south-1 environment: NODE_ENV: production functions: main: handler: dist/serverless.handler # 补充日志权限,方便排查错误 iamRoleStatements: - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: '*' events: - http: method: ANY path: / - http: method: ANY path: '{proxy+}' package: patterns: - 'dist/**' - 'node_modules/**' - '!.git/**' - '!src/**' - '!test/**' - '!*.md' - '!.env.*' # 排除开发依赖,减小包体积 - '!node_modules/@types/**' - '!node_modules/typescript/**' - '!node_modules/serverless-*/**'
3. 部署前校验步骤
- 确认本地已执行
npm run build(即NestJS编译命令),dist目录下存在编译完成的serverless.js及所有业务代码文件 - 确认项目已安装
@nestjs/platform-express依赖,这是拿到Express实例的前提 - 确认
tsconfig.json的编译target兼容Node.js 14,建议设置为ES2020,避免高版本语法在Lambda运行时报错
4. 剩余问题排查
如果修正后仍报错,直接去AWS控制台对应区域的CloudWatch服务,找到日志组/aws/lambda/prism-backend-main,查看最新日志流的错误栈,常见剩余问题包括:
- 数据库/第三方服务连接配置错误,环境变量未正确注入(不要依赖本地.env文件,生产环境建议在
provider.environment中显式配置,或通过SSM参数存储读取) - 用到Prisma/TypeORM等ORM时,未将schema、迁移文件打包进部署包
- 业务代码初始化阶段抛出未捕获的异常
内容的提问来源于stack exchange,提问作者vaibhav deep
相关产品推荐
相关产品推荐

