🥇 Lambdalith 优势:使用 CDK 在 AWS Lambda 上部署 NestJS 的完整指南

2025-06-10

🥇 Lambdalith 优势:使用 CDK 在 AWS Lambda 上部署 NestJS 的完整指南

TL;DR📚

  • 为什么 Lambdalith 方法对许多人来说是一个高投资回报率的选择?💸
  • 了解如何使用 Webpack 和 AWS CDK 在 AWS Lambda 上部署单体式 NestJS 应用程序。🚀

AWS Lambda 上 NestJS 的 Lambdalith Edge 🌟

🧠 Lambdalith 是一种用于无服务器应用程序的单体架构方法,其中单个 AWS Lambda 函数为整个 API 提供服务,而不是为每个端点部署单独的函数。

选择 Lambdalith 可为您的 NestJS API 带来多项好处:

  • 更快的推出:无论您的路线数量有多少,都可以更快地部署并简化管理。
  • 最小化冷启动:通过更频繁地重用单个 Lambda 函数来增强性能。
  • 更轻松的日志记录:单点日志简化了监控和警报设置。
  • 充分利用 NestJS 的优势:充分利用 NestJS 的丰富功能和社区支持。

虽然 Lambdalith 可能意味着更长的冷启动时间和更广泛的控制范围,但其效率、简单性和高投资回报率是无与伦比的。

Monorepo 结构🚧📦:我强烈建议您采用 monorepo 结构,其中包含用于您的 API 的包和用于您的基础设施(CDK)的包。

使用 AWS CDK 设置基础设施

AWS CDK 将基础设施转化为代码。首先安装 AWS CDK,然后使用 启动一个 TypeScript 项目cdk init app --language typescript

在该lib/my-stack.ts文件中,从设置的核心开始:Lambda 函数。

// LambdaNestStack in stack.ts
const apiNestHandlerFunction = new Function(this, "ApiNestHandler", {
  code: Code.fromAsset("api/dist"), // 👈 This is crucial
  runtime: Runtime.NODEJS_18_X,
  handler: "main.handler",
  environment: {}, // 👈 You might need env variables
});
Enter fullscreen mode Exit fullscreen mode

接下来,创建一个 Rest API,并在其根目录下添加一个 Lambda 代理。此 API 网关充当流量控制器,将所有请求定向到基于 Lambda 的 NestJS 应用。所有路由路径都将定向到您的单个 Lambda。🗾

const api = new RestApi(this, "Api", {
    deploy: true,
    defaultMethodOptions: {
    apiKeyRequired: true,
    },
});

api.root.addProxy({
    defaultIntegration: new LambdaIntegration(apiNestHandlerFunction, { proxy: true }),
});

const apiKey = api.addApiKey("ApiKey"); // 👈 to ease your testing

const usagePlan = api.addUsagePlan("UsagePlan", {
    name: "UsagePlan",
    apiStages: [
    {
        api,
        stage: api.deploymentStage,
    },
    ],
});

usagePlan.addApiKey(apiKey);
Enter fullscreen mode Exit fullscreen mode

在此代码片段中,Code.fromAsset("api/dist")至关重要。它指向捆绑的 NestJS 应用程序的位置,确保 Lambda 高效执行。

为 Lambda 准备 NestJS 应用

首先使用 创建一个新的 NestJS 应用nest new api。然后,安装@nestjs/platform-express@vendia/serverless-express软件包。
现在,您已经拥有一个经典的 NestJS 应用,可以将其适配到 AWS Lambda 中。

在该文件旁边main.ts,创建一个新lambda.ts文件。此文件将成为 Lambda 函数的入口点。

// lambda.ts
import { NestFactory } from '@nestjs/core';
import { ExpressAdapter } from '@nestjs/platform-express';
import serverlessExpress from '@vendia/serverless-express';
import { Context, Handler } from 'aws-lambda';
import express from 'express';

import { AppModule } from './app.module';

let cachedServer: Handler;

async function bootstrap() {
  if (!cachedServer) {
    const expressApp = express();
    const nestApp = await NestFactory.create(
      AppModule,
      new ExpressAdapter(expressApp),
    );

    nestApp.enableCors();

    await nestApp.init();

    cachedServer = serverlessExpress({ app: expressApp });
  }

  return cachedServer;
}

const handler = async (event: any, context: Context, callback: any) => {
  const server = await bootstrap();
  return server(event, context, callback);
};

module.exports.handler = handler;
Enter fullscreen mode Exit fullscreen mode

这段代码将由 AWS Lambda 执行。它会创建一个 NestJS 应用并将其适配到 AWS Lambda 环境。它还能确保 NestJS 应用只创建一次,从而提高性能。⚡

🗒️ 附注main.ts:您可以利用环境变量推断执行上下文,轻松设置单个入口点:Lambda 或本地

现在,我们需要将这段 TypeScript 代码捆绑到一个文件中……🤓

使用 Webpack 打包

有几种方法可以将 NestJS 应用打包到 AWS Lambda。您可以使用 Lambda Layers,但这不是最有效的方法。我们将使用 Webpack 将 NestJS 应用打包成一个文件,然后使用 AWS CDK 进行部署。

首先webpack.config.js在 API 包中创建一个新文件。该文件将定义我们的 Webpack 配置。

module.exports = function (options, webpack) {
  return {
    ...options,
    entry: ['./src/lambda.ts'],
    externals: [],
    output: {
      ...options.output,
      libraryTarget: 'commonjs2',
    },
    plugins: [
      ...options.plugins,
      new webpack.IgnorePlugin({
        checkResource(resource) {
          // Ignoring non-essential modules for Lambda deployment
          return lazyImports.includes(resource);
        },
      }),
    ],
  };
};
Enter fullscreen mode Exit fullscreen mode

此配置捆绑了我们的 Lambda 入口文件(lambda.ts)及其依赖项,为 AWS Lambda 创建了一个精简高效的包!

确保在您的package.json文件中创建一个 build-lambda 脚本!

{
  "scripts": {
    "build-lambda": "nest build --webpack --webpackPath webpack.config.js"
  }
}
Enter fullscreen mode Exit fullscreen mode

部署 NestJS 应用:到云端!☁️

得益于 Webpack,您的 NestJS 应用现在是一个紧凑的软件包。部署?非常简单:

  • 构建npm run build-lambda:在您的 API 包中运行。
  • 部署:在您的基础设施包中,执行cdk deploy

就这样,你的 NestJS 应用就升级到了 AWS Lambda,准备开始行动了。💫

您的高性能 NestJS 应用程序现已在 AWS 上线🚀

恭喜!您已解锁在 AWS Lambda 上构建强大、可扩展且高效的 NestJS 应用的策略,所有应用均使用 Webpack 和 AWS CDK 精心打包。👏👏

如果有任何不清楚的地方,或者你找到了更好的方法来实现这个结果,请随时发表评论!💬

鏂囩珷鏉ユ簮锛�https://dev.to/slsbytheodo/nestjs-on-aws-lambda-the-ultimate-cdk-deployment-strategy-for-monolithic-apis-380j
PREV
Adminator - 开源管理面板,采用两种 Python 语言编写
NEXT
开始使用 AWS 无服务器 - SQS