在CDK项目中为Lambda函数引入node-fetch模块时遇找不到模块问题
解决CDK Lambda中无法找到node-fetch模块的问题
以下是几个针对性的解决步骤,按优先级尝试:
1. 确认node-fetch版本兼容
node-fetch v3及以上是ESM模块,不支持require()语法,而你用的是Node.js 16.x运行时,代码里又用了var fetch = require("node-fetch");,所以必须安装兼容CommonJS的v2版本:
# 卸载现有版本 npm uninstall node-fetch # 安装v2版本 npm install node-fetch@2
2. 确保依赖被正确打包进Lambda
你当前用Code.fromAsset('lambda')加载代码,Lambda只会打包lambda目录下的内容。如果package.json和node_modules在项目根目录,打包时不会被包含进去,自然找不到模块。
方案A:改用NodejsFunction自动处理依赖
CDK的NodejsFunction会自动分析代码依赖,打包时将所需模块一起打包,无需手动管理node_modules或层:
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; const lambdaJiraApi = new NodejsFunction(this, 'lambda_Jira_api', { runtime: lambda.Runtime.NODEJS_16_X, entry: './lambda/apiJiraFetcher.js', // 指向你的handler文件路径 timeout: Duration.seconds(20), functionName: 'lambda_Jira_api', environment: { QUEUEURL: queueSQS.queueUrl }, });
方案B:在lambda目录下单独安装依赖
如果坚持用Code.fromAsset,需要在lambda目录内单独初始化并安装依赖:
cd lambda npm init -y npm install node-fetch@2
这样lambda目录下会生成node_modules,打包时会被包含进Lambda代码包。
3. 修复Node Fetch层的目录结构
如果你想用层管理依赖,必须遵循Lambda层的目录规范:Node.js层的模块必须放在nodejs/node_modules目录下,否则Lambda无法识别。
正确构建层的步骤:
- 创建如下目录结构:
layers/ node-fetch/ nodejs/
- 进入
nodejs目录,初始化并安装依赖:
cd layers/node-fetch/nodejs npm init -y npm install node-fetch@2
- 在CDK中定义层:
const nodeFetchLayer = new lambda.LayerVersion(this, 'NodeFetchLayer', { code: lambda.Code.fromAsset('layers/node-fetch'), compatibleRuntimes: [lambda.Runtime.NODEJS_16_X], });
4. 检查打包排除规则
确保项目根目录的.gitignore或CDK打包配置没有排除node_modules目录,否则即使安装了依赖,打包时也会被忽略。
内容的提问来源于stack exchange,提问作者joey visbeen
相关产品推荐
相关产品推荐

