如何解决在 Node.js 中运行 Lambda 代码时收到的“Unable to import module”错误?
上次更新时间:2021 年 12 月 1 日
当我尝试在 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