如何解决在 Node.js 中运行 Lambda 代码时收到的“Unable to import module”错误?

上次更新时间:2021 年 7 月 26 日

当我尝试在 Node.js 中运行 AWS Lambda 代码时,收到了“Unable to import module”错误。

简短描述

通常情况下收到此错误的原因是 Lambda 环境在 Node.js 代码中找不到指定的库。这是因为 Lambda 没有预先封装所有 Node.js 库。

要解决此错误,请创建一个部署程序包或 Lambda 层,其中包含要在 Lambda 的 Node.js 代码中使用的库。

注意:以下步骤展示如何创建 Lambda 层,并非部署程序包。这是因为您可以跨多个 Lambda 函数重复使用 Lambda 层。每个 Lambda 运行时将特定的 /opt 目录文件夹添加到 PATH 变量中。如果该层使用相同的文件夹结构,Lambda 函数的代码可以在不指定路径的情况下访问内容。

重要提示:将为 Node.js 导入的库放在 nodejs/node_modules 文件夹中。

解决方法

最佳实践是在建立 Lambda 运行时的同一操作系统上创建 Lambda 层。例如,Node.js 的所有版本都基于 Amazon Linux 2 Amazon Machine Images (AMI)。

要为 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 的权限。然后,将 IAM 角色附加到 EC2 实例

注意:您的 EC2 实例现在有权限为 publish-layer-version API 调用上传 Lambda 层。

3.    连接到 EC2 实例,然后安装 Node.js:

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node

4.    创建 nodejs 文件夹:

$ mkdir nodejs

5.    将 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 库。

6.    为 aws-xray-sdk 库创建一个 zip 格式的归档:

$ zip -r layer.zip nodejs

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

7.    发布该 Lambda 层:

$ aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region us-east-1