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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:48:21