如何从@aws-cdk/aws-lambda-nodejs迁移至AWS CDK v2?求依赖部署示例
在AWS CDK v2中部署带依赖的Node.js Lambda函数
CDK v2已经把v1的分散包整合进了统一的aws-cdk-lib库,原v1的@aws-cdk/aws-lambda-nodejs对应v2里的aws-cdk-lib/aws-lambda-nodejs模块——它依然保留了自动打包依赖的核心能力,用法和v1接近但有少量调整,下面是具体实现步骤:
1. 安装必要依赖
先确保你的项目已经升级到CDK v2,然后安装Node.js Lambda相关模块:
npm install aws-cdk-lib aws-cdk-lib/aws-lambda-nodejs @types/aws-lambda
2. 编写带第三方依赖的Lambda代码
比如在src/handler.ts中写一个用到axios的示例函数:
import axios from 'axios'; export async function handler(event: any) { const res = await axios.get('https://api.example.com/data'); return { statusCode: 200, body: JSON.stringify({ fetchedData: res.data }) }; }
3. 在CDK栈中定义Lambda函数
import { Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { Runtime } from 'aws-cdk-lib/aws-lambda'; export class MyLambdaStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new NodejsFunction(this, 'NodejsLambdaWithDeps', { runtime: Runtime.NODEJS_20_X, // 选对应版本的Node.js运行时,建议用LTS版 entry: './src/handler.ts', // 函数入口文件路径 handler: 'handler', // 代码中导出的处理函数名 // 可选:自定义打包规则 bundling: { minify: true, // 开启代码压缩减小包体积 externalModules: ['aws-sdk'], // Lambda环境自带AWS SDK,可排除避免重复打包 } }); } }
关键注意事项
- 自动打包逻辑:
NodejsFunction会自动读取项目package.json的依赖,把第三方包和业务代码一起打包成zip上传到Lambda,无需手动处理node_modules。 - 运行时兼容性:必须选择CDK支持的Node.js版本,避免使用已停止维护的运行时。
- TypeScript支持:模块原生兼容TS,无需额外配置编译流程,会自动转译为JS。
替代方案:手动打包(按需使用)
如果默认打包逻辑不符合需求,可以用esbuild或webpack手动打包,再通过lambda.Function指定打包后的文件:
import { Function, Runtime, Code } from 'aws-cdk-lib/aws-lambda'; new Function(this, 'ManualPackLambda', { runtime: Runtime.NODEJS_20_X, handler: 'dist/handler.handler', code: Code.fromAsset('./dist'), // 指向手动打包后的目录 });
对应的打包脚本可加在package.json中:
{ "scripts": { "build": "esbuild src/handler.ts --bundle --minify --platform=node --outfile=dist/handler.js" } }
内容的提问来源于stack exchange,提问作者Denys Medvediev
相关产品推荐
相关产品推荐

