我在上传 Lambda 部署程序包时遇到“permission denied”或“unable to import module”错误,如何进行问题排查?

上次更新日期:2021 年 5 月 19 日

当我尝试上传 AWS Lambda 部署包,我收到权限遭拒或无法导入模块的错误。如何解决这些错误?

简短描述

Lambda 需要针对代码文件和部署程序包中的所有依赖库的全局读取权限。如果未使用正确的安全权限配置 Lambda 部署包,则在您尝试上传文件时,Lambda 将会返回错误。在由持续集成应用程序创建部署包时,常常会发生这些权限遭拒无法导入模块错误。

Lambda 部署包内的所有可执行文件的正确权限用 Unix 权限数字表示法表示 644。对于部署包内的文件夹,正确的权限设置为 755

注意:由于 Lambda 使用 POSIX 权限,因此,在构建 Lambda 部署包时,最好使用与 POSIX 兼容的操作系统。例如,Linux、Unix 或 macOS。构建环境和 Lambda 运行时环境中的权限模型之间的奇偶校验可以减少权限问题发生的可能性。

如果您使用 Windows 进行开发且需要修复权限问题,可以执行以下任一操作来设置 Linux 环境:

解决方法

确认导致错误的文件或文件夹

错误消息中可能未明确提示错误原因,具体取决于用于编写 Lambda 函数代码的编程语言

例如,Node.js 函数错误消息会列出错误源的文件或文件夹名称。但是,Python 函数错误消息不会列出错误源的文件或文件夹名称。

Node.js Lambda 函数权限遭拒错误示例

{
  "errorMessage": "EACCES: permission denied, open '/var/task/index.js'",
  "errorType": "Error",
  "stackTrace": [
    "Object.fs.openSync (fs.js:641:18)",
    "Object.fs.readFileSync (fs.js:509:33)",
    "Object.Module._extensions..js (module.js:578:20)",
    "Module.load (module.js:487:32)",
    "tryModuleLoad (module.js:446:12)",
    "Function.Module._load (module.js:438:3)",
    "Module.require (module.js:497:17)",
    "require (internal/module.js:20:19)"
  ]
}

Python Lambda 函数无法导入模块错误示例

Unable to import module 'index': No module named index

缺少所需权限的外部库出现 Python Lambda 函数无法导入模块错误的示例

Unable to import module 'index': No module named requests

要检查部署包 .zip 文件内的所有文件或文件夹的权限,请在命令行界面 (CLI) 中运行以下 zipinfo 命令:
重要提示:lambda-package.zip 替换为部署包 .zip 文件名称。

zipinfo lambda-package.zip

Zipinfo 命令响应示例

Archive:  lambda-package.zip
Zip file size: 305 bytes, number of entries: 1
-r--------  3.0 unx      188 tx defN 21-Feb-13 20:48 example.py
1 file, 188 bytes uncompressed, 135 bytes compressed:  28.2%

注意:在此示例中,example.py 的权限用 Unix 权限数字表示法-r--------400,因此,文件的权限需要更新为 644

更新部署包的权限

注意:以下命令仅适用于 Linux、Unix 和 macOS 操作系统。

1.    要将部署包内的文件和文件夹解压到临时文件夹,请在 CLI 中运行以下命令:
重要提示:lambda-package.zip 替换为部署包的文件名。将 temp-folder 替换为您想要赋予新的临时文件夹的名称。

mkdir temp-folder; unzip lambda-package.zip -d temp-folder ;cd temp-folder;ls -l

2.    更新库文件的权限

注意:要使任何用户都能够读取当前目录中的所有文件和文件夹,请运行以下 chmod 命令:

$ chmod 644 $(find /tmp/package_contents -type f)
$ chmod 755 $(find /tmp/package_contents -type d)

3.    修复权限之后,通过运行以下命令将文件和文件夹重新打包为新的 .zip 文件:

zip -r new-lambda-package.zip *

这篇文章对您有帮助吗?


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