Nestjs项目实战 AWS Lambda无服务器部署教程
我在使用NestJS开发项目,想部署到AWS Lambda实现无服务器架构,但遇到几个问题:
- NestJS项目如何正确打包才能适配Lambda运行环境?需要特别配置webpack吗?
- 官方文档提到
@nestjs/platform-express
和@nestjs/platform-aws
的区别,在Lambda部署时两者该如何选择? - 本地开发时用的环境变量(如数据库连接),部署到Lambda后如何安全管理?必须用AWS Parameter Store吗?
- 为什么我的Lambda冷启动时间超过5秒?有没有优化NestJS初始化性能的实践经验?
- API Gateway集成时,如何统一处理NestJS的全局拦截器和Lambda的返回格式差异?
求有实战经验的大佬分享完整部署流程和避坑指南!
3 回复
在NestJS项目中部署到AWS Lambda实现无服务器架构,首先确保安装serverless-http
和@nestjs/platform-serverless
。
- 初始化Serverless框架,全局安装
serverless
CLI。 - 在项目根目录初始化
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/**.*
- 修改
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();
- 部署命令:
sls deploy --verbose
。完成后可获取API Gateway访问地址。
注意调整环境变量、依赖优化(如使用serverless-webpack
)以提升性能。
-
环境搭建:安装Node.js、NestJS CLI和AWS CLI,配置AWS凭证。
-
创建NestJS项目:使用
nest new project-name
创建项目,并确保代码符合无服务器架构需求。 -
安装依赖:
npm install --save [@nestjs](/user/nestjs)/aws-lambda [@aws-sdk](/user/aws-sdk)/client-s3
-
配置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();
-
构建项目:
npm run build
-
部署到AWS Lambda:
- 使用Serverless Framework或AWS SAM。
- 配置
serverless.yml
或template.yaml
,指定函数名称、运行时和环境变量。
-
测试与调试:通过AWS Console或本地工具(如SAM CLI)测试函数。
-
监控与优化:启用CloudWatch日志,优化冷启动性能。
NestJS 项目 AWS Lambda 无服务器部署教程
准备工作
- 确保已安装 Node.js 和 AWS CLI
- AWS 账户已配置好 IAM 权限
部署步骤
- 安装必要依赖
npm install --save @nestjs/platform-express aws-serverless-express @types/aws-lambda
- 创建 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;
};
- 修改
main.ts
支持本地开发
async function bootstrap() {
if (process.env.IS_LAMBDA) {
return;
}
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
- 配置
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
- 部署到 AWS Lambda
# 构建项目
npm run build
# 使用 Serverless Framework 部署
npx serverless deploy
注意事项
- 确保 Lambda 有足够的权限访问其他 AWS 服务
- 冷启动问题可以通过配置预置并发来缓解
- 环境变量可通过
serverless.yml
或 AWS 控制台设置
部署完成后,Serverless 会输出 API Gateway 的 URL,你的 NestJS 应用就可以通过该 URL 访问了。