如何解决在 Node.js 中运行 Lambda 代码时收到的“找不到模块”或“找不到程序包”错误?

2 分钟阅读
0

在 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 层。

  1. 连接到 EC2 实例,然后安装 Node.js:
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node
  1. 创建 nodejs 文件夹:
$ mkdir nodejs
  1. 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 库。

  1. aws-xray-sdk 库创建一个 zip 存档:
$ zip -r layer.zip nodejs

**注意:**aws-xray-sdk 库采用 Node.js 层要求的文件夹格式:nodejs/node_modules

  1. 发布该 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 部署包时遇到“权限被拒绝”或“无法导入模块”错误,如何进行问题排查?

AWS 官方
AWS 官方已更新 1 年前