Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
当在 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 层,请完成以下步骤:
从 Amazon Linux 2 AMI 创建一个 Amazon Elastic Compute Cloud (Amazon EC2) 实例。
创建一个 AWS Identity and Access Management (IAM) 角色,使其具有调用 publish-layer-version API 的权限。
将 IAM 角色附加到 Amazon EC2 实例。 **注意:**您的 EC2 实例现在有权限为 publish-layer-version API 调用上传 Lambda 层。
使用 SSH 连接到您的 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 for 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 层,请运行以下 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 部署包?