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

上次更新时间:2021 年 1 月 8 日

我在 Node.js 中创建了一个 AWS Lambda 函数,在调用期间收到了“Cannot find module”错误。我该如何构建部署程序包以避免这些错误?

简短描述

Cannot find module 错误产生的原因通常有三种:

  • Lambda 函数的部署程序包文件夹结构不正确,因此 Lambda 服务无法加载所需的模块和库。
  • 部署程序包没有正确的文件权限。
  • 部署程序包未包含要导入的模块。

注意:Lambda 需要全局读取权限。

解决方法

要创建包含 .zip 文件的根文件夹中函数代码的部署程序包,然后为其授予所有文件的读取和执行权限,请执行以下操作。

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

对于 Linux 和 macOS

将依赖项安装到函数项目文件夹下

注意:大多数 Node.js 模块都与平台无关,但部分模块是针对特定操作系统环境编译的。Lambda 在 Linux 环境下运行。如果使用 npm 安装模块,最佳实践是在 Linux 环境中构建 .zip 文件,以确保包含正确的平台依赖项。

1.    在 AWS CLI 中,将目录更改为您的项目文件夹。例如:

cd /project-folder-name

重要提示:确保将 project-folder-name 替换为您的实际项目文件夹的名称。

2.    通过为您的函数所需的每个模块运行以下命令,在本地将依赖项安装到您的函数项目文件夹中:

npm install package-name

重要提示:请务必将 package-name 替换为实际程序包名称。对于解压缩后的文件,函数大小不得超过 250MB。仅包括函数正常工作所需的库。

例如,要将适用于 JavaScript 的 AWS 开发工具包模块安装到项目文件夹的根目录下,请运行以下命令:

npm install aws-sdk

注意:Lambda 将适用于 JavaScript 的 AWS 开发工具包库作为基本容器配置的一部分。要使用不同版本的库,您还可以包含本地副本。有关当前 Lambda 环境和支持的库的更多信息,请参阅 Lambda 执行环境和可用库

构建部署程序包

在 AWS CLI 中,运行以下命令:

zip -r ../function-name.zip .

注意:请将 function-name 替换为您希望为自己的部署程序包使用的文件名。这会将项目文件夹中的所有文件置入父文件夹中的 .zip 文件内。

验证部署程序包

1.    在 AWS CLI 中,运行以下命令:

zipinfo ../function-name.zip

注意:请将 function-name 替换为您希望为您的部署程序包使用的实际文件名。您也可以对 .zip 文件运行 unzip -l,以列出其内容,但输出结果可能不够详细。

2.    检查输出结果,确保函数处理程序源文件位于 .zip 文件的根目录中。

3.    检查输出结果,确保您的文件具有全局读取权限。有关更多信息,请参阅我在上传部署程序包时遇到 Lambda 错误“permission denied”或“unable to import module”,如何进行问题排查?

对于 Windows

构建部署程序包

1.    在文件资源管理器中,打开您的项目文件夹。

2.    选择所有项目文件,然后右键单击以打开上下文菜单。

3.    选择发送到,然后选择压缩 (zipped) 文件夹

4.    为 .zip 文件输入一个名称。

上传并验证部署程序包

1.    在 Lambda 控制台中,选择您的函数。

2.    对于 Function code (函数代码) 下的代码输入种类,选择 上传 .zip 文件

3.    在函数程序包下,选择上传

4.    选择您创建的 .zip 文件,然后选择打开

5.    在控制台顶部,选择保存

提示:您还可以通过 AWS CLI 运行 update-function-code 来上传 .zip 文件。

6.    上传完成后,选择测试

提示:您还可以通过 AWS CLI 使用 7-Zip 验证您的部署程序包的文件权限。您可以通过 7-Zip 网站下载该程序。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?