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

2 分钟阅读
0

当在 Node.js 中运行 AWS Lambda 代码时,我收到“Cannot find module”(找不到模块)或“Cannot find Package”(找不到程序包)错误。

简短描述

如果 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 20 的 JavaScript ES 模块依赖关系。

创建 Lambda 层而不是部署包,这样您就可以跨多个 Lambda 函数重复使用该层。每个 Lambda 运行时都会向 PATH 变量添加特定的 /opt 目录文件夹。如果该层使用相同的文件夹结构,Lambda 函数的代码可以在不指定路径的情况下访问内容。

**重要事项:**为 Node.js 导入的库必须位于 nodejs/node_modules 文件夹结构中。

最佳做法是在 Lambda 支持的运行时所基于的同一操作系统 (OS) 上创建 Lambda 层。例如,Node.js 的最新版本均基于 Amazon Linux 2023 亚马逊机器映像 (AMI)。

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

要为 Node.js 库创建 Lambda 层,请完成以下步骤:

  1. 从 Amazon Linux 2 AMI 创建一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例

  2. 创建一个 AWS Identity and Access Management (IAM) 角色,使其具有调用 publish-layer-version API 的权限。

  3. 将 IAM 角色附加到 Amazon EC2 实例
    **注意:**您的 EC2 实例现在有权限为 publish-layer-version API 调用上传 Lambda 层。

  4. 使用 SSH 连接到您的 EC2 实例

  5. 安装 Node.js:

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash$ . ~/.nvm/nvm.sh
    nvm install node
    
  6. 创建 nodejs 文件夹:

    mkdir nodejs
    
  7. aws-xray-sdk 库安装到 nodejs 文件夹中:

    cd nodejs$ npm init  ***answer all queries for initialization that create a package.json file***
    npm install --save aws-xray-sdk
    

    **注意:**请将 aws-xray-sdk 示例库替换为要导入的 Node.js 库。

  8. aws-xray-sdk 库创建一个 zip 存档:

    zip -r layer.zip nodejs
    

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

  9. 要发布 Lambda 层,请运行以下 publish-layer-version 命令:

    aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region your-region
    

    **注意:**请将 your-region 替换为您的 AWS 区域。

要在您的代码中添加模块 ECMAScript 6 (ES6) 或 CommonJS,请参阅 JavaScript ES6/CommonJS syntax

相关信息

我在上传 Lambda 部署包时遇到“permission denied”(权限被拒绝)或“unable to import module”(无法导入模块)错误,如何进行问题排查?

如何为 Node.js 构建 Lambda 部署包?

AWS 官方
AWS 官方已更新 1 个月前