使用CDK创建Lambda函数时出现Error - ENOENT错误求助
问题分析与解决方案
1. 路径错误引发ENOENT
ENOENT错误本质是CDK无法定位你指定的index.js文件。请确认CDK代码中entry的路径配置:
- 若CDK代码与
authorizer文件夹同级,entry应设为./authorizer/lib/index.js - 若CDK代码在其他目录,建议使用绝对路径避免相对路径混乱,示例:
import { join } from 'path'; // 假设CDK代码在根目录下的cdk文件夹中 entry: join(__dirname, '../../authorizer/lib/index.js')
同时确保handler参数与index.js中导出的函数名一致(比如你的函数导出为exports.handler = ...,则handler设为handler)。
2. 打包配置未包含node_modules
你的需求是将node_modules一同打包,需根据CDK使用的Lambda构造函数调整配置:
方案一:直接打包整个目录(推荐)
使用lambda.Function配合AssetCode将authorizer目录下所有文件(含node_modules)打包为zip:
import * as lambda from 'aws-cdk-lib/aws-lambda'; import { join } from 'path'; const authLambda = new lambda.Function(this, 'AuthorizerLambda', { code: lambda.AssetCode.fromAsset(join(__dirname, '../authorizer')), // 打包整个authorizer目录 handler: 'lib/index.handler', // 格式为「文件路径.导出函数名」 runtime: lambda.Runtime.NODEJS_20_X, });
此方式会完整保留authorizer内的目录结构,Lambda执行时可直接访问node_modules中的依赖。
方案二:调整NodejsFunction的打包策略
若你使用NodejsFunction(默认用esbuild打包),需配置让其保留外部依赖:
import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as nodejs from 'aws-cdk-lib/aws-lambda-nodejs'; import { join } from 'path'; const authLambda = new nodejs.NodejsFunction(this, 'AuthorizerLambda', { entry: join(__dirname, '../authorizer/lib/index.js'), handler: 'handler', runtime: lambda.Runtime.NODEJS_20_X, bundling: { externalModules: ['*'], // 标记所有依赖为外部模块,不打包进代码 }, });
注意:需确保authorizer目录下已安装好依赖,CDK会自动将node_modules包含进打包文件。
3. 修正项目结构(关键)
根据你提供的结构,package.json和node_modules与authorizer同级,这会导致Lambda执行时,代码在lib/目录下,而依赖在根目录,require调用会找不到模块。建议调整为以下结构:
/authorizer /lib -index.js -package.json -node_modules -package.lock.json
将所有Lambda相关文件放在authorizer目录内,确保依赖与代码层级匹配。
验证打包结果
部署前可检查cdk.out目录下生成的zip包,解压后确认:
lib/index.js存在且路径正确node_modules完整包含在内
内容的提问来源于stack exchange,提问作者Nirmal
相关产品推荐
相关产品推荐

