Nestjs项目实战 AWS Lambda无服务器部署教程

我在使用NestJS开发项目,想部署到AWS Lambda实现无服务器架构,但遇到几个问题:

  1. NestJS项目如何正确打包才能适配Lambda运行环境?需要特别配置webpack吗?
  2. 官方文档提到@nestjs/platform-express@nestjs/platform-aws的区别,在Lambda部署时两者该如何选择?
  3. 本地开发时用的环境变量(如数据库连接),部署到Lambda后如何安全管理?必须用AWS Parameter Store吗?
  4. 为什么我的Lambda冷启动时间超过5秒?有没有优化NestJS初始化性能的实践经验?
  5. API Gateway集成时,如何统一处理NestJS的全局拦截器和Lambda的返回格式差异?

求有实战经验的大佬分享完整部署流程和避坑指南!


3 回复

在NestJS项目中部署到AWS Lambda实现无服务器架构,首先确保安装serverless-http@nestjs/platform-serverless

  1. 初始化Serverless框架,全局安装serverless CLI。
  2. 在项目根目录初始化serverless.yml配置文件:
service: nestjs-lambda

provider:
  name: aws
  runtime: nodejs14.x
  region: us-east-1

functions:
  api:
    handler: dist/main.serverless
    events:
      - http: 'ANY /'
      - http: 'ANY /{proxy+}'

package:
  include:
    - dist/**.*
  1. 修改main.ts适配Serverless,添加serverless-http包装:
import { NestFactory } from '@nestjs/core';
import * as serverless from 'serverless-http';
import { AppModule } from './app/app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const expressApp = app.getHttpAdapter().getInstance();
  module.exports.handler = serverless(expressApp);
}
bootstrap();
  1. 部署命令:sls deploy --verbose。完成后可获取API Gateway访问地址。

注意调整环境变量、依赖优化(如使用serverless-webpack)以提升性能。


  1. 环境搭建:安装Node.js、NestJS CLI和AWS CLI,配置AWS凭证。

  2. 创建NestJS项目:使用nest new project-name创建项目,并确保代码符合无服务器架构需求。

  3. 安装依赖

    npm install --save [@nestjs](/user/nestjs)/aws-lambda [@aws-sdk](/user/aws-sdk)/client-s3
    
  4. 配置Lambda适配器

    import { NestFactory } from '[@nestjs](/user/nestjs)/core';
    import { AppModule } from './app.module';
    import { AwsLambdaRuntime } from '[@nestjs](/user/nestjs)-aws/serverless-core';
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      AwsLambdaRuntime.initialize(app);
    }
    bootstrap();
    
  5. 构建项目

    npm run build
    
  6. 部署到AWS Lambda

    • 使用Serverless Framework或AWS SAM。
    • 配置serverless.ymltemplate.yaml,指定函数名称、运行时和环境变量。
  7. 测试与调试:通过AWS Console或本地工具(如SAM CLI)测试函数。

  8. 监控与优化:启用CloudWatch日志,优化冷启动性能。

NestJS 项目 AWS Lambda 无服务器部署教程

准备工作

  1. 确保已安装 Node.js 和 AWS CLI
  2. AWS 账户已配置好 IAM 权限

部署步骤

  1. 安装必要依赖
npm install --save @nestjs/platform-express aws-serverless-express @types/aws-lambda
  1. 创建 Lambda 适配文件 (src/lambda.ts)
import { Handler } from 'aws-lambda';
import * as serverlessExpress from 'aws-serverless-express';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ExpressAdapter } from '@nestjs/platform-express';
import * as express from 'express';

let cachedServer;

async function bootstrapServer(): Promise<any> {
  const expressApp = express();
  const adapter = new ExpressAdapter(expressApp);
  const app = await NestFactory.create(AppModule, adapter);
  await app.init();
  return serverlessExpress.createServer(expressApp);
}

export const handler: Handler = async (event, context) => {
  if (!cachedServer) {
    cachedServer = await bootstrapServer();
  }
  return serverlessExpress.proxy(cachedServer, event, context, 'PROMISE').promise;
};
  1. 修改 main.ts 支持本地开发
async function bootstrap() {
  if (process.env.IS_LAMBDA) {
    return;
  }
  
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();
  1. 配置 serverless.yml 文件
service: nestjs-lambda

provider:
  name: aws
  runtime: nodejs14.x
  region: us-east-1
  memorySize: 256

functions:
  main:
    handler: dist/lambda.handler
    events:
      - http:
          path: /
          method: ANY
          cors: true
      - http:
          path: /{proxy+}
          method: ANY
          cors: true

plugins:
  - serverless-offline
  1. 部署到 AWS Lambda
# 构建项目
npm run build

# 使用 Serverless Framework 部署
npx serverless deploy

注意事项

  • 确保 Lambda 有足够的权限访问其他 AWS 服务
  • 冷启动问题可以通过配置预置并发来缓解
  • 环境变量可通过 serverless.yml 或 AWS 控制台设置

部署完成后,Serverless 会输出 API Gateway 的 URL,你的 NestJS 应用就可以通过该 URL 访问了。

回到顶部