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

如何在AWS Lambda上运行NestJS微服务而无需启动实际服务器?

在AWS Lambda上运行NestJS无服务器应用的方案

问题1:无需创建实际服务器对接API Gateway运行NestJS函数

完全可以做到!NestJS本身是一层框架抽象,不需要绑定HTTP服务器端口就能工作。核心思路是初始化Nest应用但不启动监听,转而把AWS Lambda的事件转换成Nest能识别的请求格式,处理完成后再把响应转换回Lambda要求的格式。

具体实现步骤:

  • 先安装必要依赖:确保你有@nestjs/core、@nestjs/platform-express(或@nestjs/platform-fastify),以及aws-lambda;TypeScript用户还需安装@types/aws-lambda补全类型。
  • 编写Lambda处理函数:
    1. 初始化Nest应用实例,调用app.init()而非app.listen():
      import { NestFactory } from '@nestjs/core';
      import { AppModule } from './app.module';
      import { ExpressAdapter } from '@nestjs/platform-express';
      import * as express from 'express';
      import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
      
      let appInstance: any;
      const expressApp = express();
      
      async function bootstrap() {
        const adapter = new ExpressAdapter(expressApp);
        appInstance = await NestFactory.create(AppModule, adapter);
        await appInstance.init();
      }
      
      export const handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
        // 冷启动时初始化应用
        if (!appInstance) {
          await bootstrap();
        }
        // 将API Gateway事件映射到Express请求对象
        expressApp.request.method = event.httpMethod;
        expressApp.request.url = event.path;
        expressApp.request.headers = event.headers;
        expressApp.request.body = event.body ? JSON.parse(event.body) : null;
        expressApp.request.query = event.queryStringParameters || {};
        expressApp.request.params = event.pathParameters || {};
      
        // 让Nest处理请求
        await new Promise((resolve) => expressApp(expressApp.request, expressApp.response, resolve));
      
        // 把Express响应转换成Lambda返回格式
        return {
          statusCode: expressApp.response.statusCode,
          headers: expressApp.response.getHeaders(),
          body: expressApp.response.body || '',
        };
      };
      
    2. 这样Lambda收到API Gateway的事件后,会通过Express适配器交给Nest处理,全程不需要启动HTTP服务器监听端口。

问题2:复用NestJS MVC抽象处理请求,及其他无服务器方案

你提到的「传入URI和请求数据让Nest处理」完全可行——上面的方案已经实现了这个逻辑:我们把Lambda事件里的URI、请求数据映射到Nest的请求对象,让Nest的控制器、路由、参数解析等MVC特性正常工作,无需自己从头构建MVC模式。

针对你5个微服务转独立Lambda的场景,建议每个Lambda对应一个独立的Nest应用(每个应用仅包含对应微服务的模块、控制器),然后通过API Gateway的路径规则(比如/service1/*映射到service1的Lambda,/service2/*映射到service2的Lambda)完成请求分发。

除了手动适配的方案,还有几个更便捷的选择:

  • 使用Nest官方AWS Lambda适配器:@nestjs/aws-lambda包能自动处理Lambda事件与Nest应用的对接,省去手动映射req/res的麻烦,示例代码如下:
    import { Handler, Context } from 'aws-lambda';
    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    import { LambdaAdapter } from '@nestjs/aws-lambda';
    
    let lambdaAdapter: LambdaAdapter;
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      lambdaAdapter = new LambdaAdapter(app);
      await app.init();
    }
    
    export const handler: Handler = async (event: any, context: Context) => {
      if (!lambdaAdapter) {
        await bootstrap();
      }
      return lambdaAdapter.handle(event, context);
    };
    
  • Serverless Framework + NestJS插件:如果用Serverless Framework部署Lambda,serverless-nestjs插件可以帮你自动打包Nest应用为Lambda函数,处理适配逻辑,大幅减少手动配置。
  • AWS SAM:AWS官方的无服务器部署工具,配合NestJS的Lambda适配代码,通过SAM模板就能定义API Gateway和Lambda的映射关系,实现一键部署。

另外要注意,Lambda冷启动时会初始化Nest应用,建议优化初始化速度:比如精简模块依赖、用Lambda层复用公共依赖,提升冷启动性能。

内容的提问来源于stack exchange,提问作者Ben Beri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:03:11