AWS Lambda无法找到@elastic/elasticsearch包问题求助
AWS Lambda中无法找到@elastic/elasticsearch包的问题解决
问题描述
在AWS Lambda中运行代码时触发错误:Cannot find package '@elastic/elasticsearch' imported from /var/task/index.mjs,即使尝试添加Elasticsearch Layer到Lambda函数后,仍出现相同错误。
已执行的操作
npm install @elastic/elasticsearchmkdir -p my-layer/nodejs/node_modulescp -r node_modules/@elastic my-layer/nodejs/node_moduleszip -r my-layer.zip my-layer- 创建Layer并关联到Lambda函数
错误堆栈追踪
undefined ERROR Uncaught Exception {"errorType":"Error","errorMessage":"Cannot find package '@elastic/elasticsearch' imported from /var/task/index.mjs","code":"ERR_MODULE_NOT_FOUND","stack":["Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@elastic/elasticsearch' imported from /var/task/index.mjs"," at new NodeError (node:internal/errors:405:5)"," at packageResolve (node:internal/modules/esm/resolve:965:9)"," at moduleResolve (node:internal/modules/esm/resolve:1022:20)"," at moduleResolveWithNodePath (node:internal/modules/esm/resolve:876:12)"," at defaultResolve (node:internal/modules/esm/resolve:1242:79)"," at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:403:12)"," at ModuleLoader.resolve (node:internal/modules/esm/loader:372:25)"," at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:249:38)"," at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:76:39)"," at link (node:internal/modules/esm/module_job:75:36)"]} INIT_REPORT Init Duration: 196.17 ms Phase: init Status: error Error Type: Runtime.ExitError 2024-04-06T07:39:53.096Z undefined ERROR Uncaught Exception {"errorType":"Error","errorMessage":"Cannot find package '@elastic/elasticsearch' imported from /var/task/index.mjs","code":"ERR_MODULE_NOT_FOUND","stack":["Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@elastic/elasticsearch' imported from /var/task/index.mjs"," at new NodeError (node:internal/errors:405:5)"," at packageResolve (node:internal/modules/esm/resolve:965:9)"," at moduleResolve (node:internal/modules/esm/resolve:1022:20)"," at moduleResolveWithNodePath (node:internal/modules/esm/resolve:876:12)"," at defaultResolve (node:internal/modules/esm/resolve:1242:79)"," at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:403:12)"," at ModuleLoader.resolve (node:internal/modules/esm/loader:372:25)"," at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:249:38)"," at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:76:39)"," at link (node:internal/modules/esm/module_job:75:36)"]}
问题原因
你创建Layer时的目录结构不符合Lambda Node.js运行时的依赖加载规则。仅复制@elastic目录到my-layer/nodejs/node_modules下,会导致包的元数据(如package.json)无法被Node.js的ESM模块解析器正确识别,进而触发找不到包的错误。
正确的Layer创建步骤
- 创建符合规范的Layer目录并安装依赖:
# 创建Layer基础目录 mkdir -p my-layer/nodejs # 进入nodejs目录初始化npm cd my-layer/nodejs npm init -y # 安装@elastic/elasticsearch包 npm install @elastic/elasticsearch # 返回上级目录 cd ../.. - 打包Layer:
zip -r my-layer.zip my-layer/ - 将打包后的
my-layer.zip上传为AWS Lambda Layer,并在目标Lambda函数的配置中关联该Layer。
额外检查要点
- 确保本地安装依赖时使用的Node.js版本与Lambda函数配置的运行时版本一致,避免因版本差异导致的兼容性问题。
- 验证Lambda函数的Layers配置,确认目标Layer已成功关联且版本正确。
- 如果你使用ESM模块(
.mjs文件),确保导入语句格式正确:import { Client } from '@elastic/elasticsearch';
内容的提问来源于stack exchange,提问作者Shamitha Reddy Regenti
相关产品推荐
相关产品推荐

