CDK部署Lambda时无法识别AWS SDK for JavaScript v3问题咨询
问题原因
AWS Lambda 官方提供的 Node.js 运行环境默认仅预装了 AWS SDK for JavaScript v2 版本,v3 的所有包都没有内置,需要自行打包上传到 Lambda 执行环境。
你在Web控制台直接粘贴代码能正常运行,通常是因为测试用的Lambda已经提前配置了包含AWS SDK v3的Lambda层,或者你在控制台内置的代码编辑器中执行过依赖安装操作,控制台会自动把依赖存到执行环境中,而CDK部署时是全新的干净执行环境,没有这些额外配置因此触发找不到模块的报错。
解决方案
根据你使用的CDK Lambda构造类型,可以选择两种处理方式:
方案1:使用 @aws-cdk/aws-lambda-nodejs 模块的 NodejsFunction 构造(推荐)
这是CDK专门为Node.js生态的Lambda提供的优化构造,会自动调用esbuild工具把你的代码和所有依赖打包成单个执行文件,不需要手动处理依赖安装、打包流程:
- 首先在CDK项目根目录安装对应的依赖包:
npm install @aws-cdk/aws-lambda-nodejs - 替换原有Lambda构造的声明,示例代码如下:
import { NodejsFunction } from '@aws-cdk/aws-lambda-nodejs'; import { Runtime } from 'aws-cdk-lib/aws-lambda'; const hitcounterLambda = new NodejsFunction(this, 'HitcounterLambda', { // 填写你的Lambda源码本地路径,支持.ts和.js格式 entry: './lambda/hitcounter.ts', // 建议选择Node.js 18.x及以上版本,兼容v3 SDK的所有特性 runtime: Runtime.NODEJS_18_X, // 你的代码中导出的处理函数名 handler: 'handler', });
配置完成后正常执行cdk deploy即可,CDK会自动把你代码中引入的@aws-sdk/client-dynamodb等v3依赖打包到部署包中。
方案2:使用原生 lambda.Function 构造,手动打包依赖
如果你需要沿用原生的Function构造,需要自行提前安装Lambda的所有依赖再让CDK打包上传:
- 进入你存放Lambda业务代码的本地目录(即hitcounter.js所在的文件夹)
- 执行以下命令初始化包配置并安装生产依赖:
npm init -y npm install --production @aws-sdk/client-dynamodb @aws-sdk/util-dynamodb # 其他你用到的v3 SDK包也在这里一起安装
- 修改CDK中Lambda构造的声明,将
code参数指向整个业务代码目录,而非单独的js文件:
import { Function, Runtime, Code } from 'aws-cdk-lib/aws-lambda'; const hitcounterLambda = new Function(this, 'HitcounterLambda', { // 指向存放Lambda代码和node_modules的整个目录 code: Code.fromAsset('./lambda'), runtime: Runtime.NODEJS_18_X, // 格式为「文件名.导出函数名」 handler: 'hitcounter.handler', });
可选优化
如果有多个Lambda需要用到AWS SDK v3,可以单独制作一个包含所有v3依赖的Lambda层,在CDK中给所有需要的Lambda绑定该层即可,避免重复打包依赖、减小每个Lambda的部署包体积。
内容的提问来源于stack exchange,提问作者Armen Babakanian
相关产品推荐
相关产品推荐

