AWS re:Post Knowledge Center Feedback Survey
Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
当在 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 部署包?