在 Node.js 中运行 Amazon Lambda 代码时,收到“找不到模块”或“找不到程序包”错误。
简短描述
如果 Lambda 环境在 Node.js 代码中找不到指定的库,则会收到以下错误之一。之所以出现这些错误,是因为 Lambda 没有预先封装所有 Node.js 库。
- 如果 CommonJS 缺少模块,则会收到以下错误: Runtime.ImportModuleError: 错误: 找不到模块。
- 如果 JavaScript ES6 缺少模块,则会收到以下错误: 错误 [ERR_MODULE_NOT_FOUND]: 找不到程序包。
要解决这些错误,请创建一个部署包或 Lambda 层,其中包含要在 Node.js 代码中使用的库。
对于 Node.js 运行时系统 16 及更低版本,Lambda 不支持分层的 JavaScript ES 模块依赖关系。您必须在部署中包含依赖关系。
Lambda 支持 Node.js 18 的 JavaScript ES 模块依赖关系。
使用以下步骤创建 Lambda 层。创建 Lambda 层而不是部署包,这样您就可以跨多个 Lambda 函数重复使用该层。每个 Lambda 运行时系统都会向 PATH 变量添加特定的 /opt 目录文件夹。如果该层使用相同的文件夹结构,Lambda 函数的代码可以在不指定路径的情况下访问层内容。
**重要事项:**为 Node.js 导入的库必须位于 nodejs/node_modules 文件夹结构中。
解决方法
最佳做法是在 Lambda 运行时系统所基于的操作系统上创建 Lambda 层。例如,Node.js 的所有版本都基于 Amazon Linux 2 亚马逊云机器镜像 (AMI, Amazon Machine Images)。
为 Node.js 库创建 Lambda 层:
1. 从 Amazon Linux 2 AMI 创建一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例。
2. 创建一个 Amazon Identity and Access Management (IAM) 角色,赋予该角色调用 publish-layer-version API 的权限。然后,将 IAM 角色附加到 EC2 实例。
**注意:**您的 EC2 实例现在有权限为 publish-layer-version API 调用上传 Lambda 层。
- 连接到 EC2 实例,然后安装 Node.js:
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node
- 创建 nodejs 文件夹:
$ mkdir nodejs
- 将 aws-xray-sdk 库安装到 nodejs 文件夹中:
$ cd nodejs
$ npm init ***answer all queries regarding initialization that create a package.json file***
$ npm install --save aws-xray-sdk
**注意:**将 aws-xray-sdk 示例库替换为要导入的 Node.js 库。
- 为 aws-xray-sdk 库创建一个 zip 存档:
$ zip -r layer.zip nodejs
**注意:**aws-xray-sdk 库采用 Node.js 层要求的文件夹格式:nodejs/node_modules。
-
发布该 Lambda 层:
$ aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region us-east-1
注意: 要在读取的代码中添加模块 ECMAScript 6 (ES6) 或 CommonJS,请参阅 JavaScript ES6/CommonJS 语法。
相关信息
我在上传 Lambda 部署包时遇到“权限被拒绝”或“无法导入模块”错误,如何进行问题排查?