🥇 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
});
接下来,创建一个 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);
在此代码片段中,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;
这段代码将由 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);
},
}),
],
};
};
此配置捆绑了我们的 Lambda 入口文件(lambda.ts
)及其依赖项,为 AWS Lambda 创建了一个精简高效的包!
确保在您的package.json
文件中创建一个 build-lambda 脚本!
{
"scripts": {
"build-lambda": "nest build --webpack --webpackPath webpack.config.js"
}
}
部署 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