我在上传部署程序包时遇到 Lambda 错误“permission denied”或“unable to import module”,如何进行问题排查?
上次更新时间:2019-04-10
我上传了 AWS Lambda 部署程序包文件,但收到一条错误消息。出了什么问题?我该如何解决?
简短描述
权限有误是持续集成应用程序生成的程序包中的常见问题。如果为您的 Lambda 部署程序包 .zip 或 .jar 文件设置的安全权限有误,在您尝试上传文件时将会收到错误消息。Lambda 需要针对代码文件和部署程序包中的所有依赖库的全局读取权限。
注意:Lambda 使用 POSIX 权限,因此我们推荐在构建 Lambda 部署程序包时使用兼容 POSIX 的操作系统(例如,Linux、Unix 或 macOS)。构建环境的权限模型和执行环境的权限模型之间的奇偶校验可以减少权限问题发生的可能性。
如果您使用 Windows 进行开发且需要修复权限问题,可以执行以下任一操作来设置 Linux 环境:
- 在您的 PC (仅 Windows 10)上安装 Linux 发行版。有关更多信息,请参阅 Microsoft Docs 网站上的 Windows Subsystem for Linux Installation Guide for Windows 10。
- 使用 Lambda 的 Amazon 系统映像 (AMI) 启动 Amazon Elastic Compute Cloud (Amazon EC2) 实例。
解决方法
确定引起错误的原因
根据您编写 Lambda 函数代码时所使用的语言,错误消息中可能未明确提示错误原因。例如,在 Node.js 函数中错误比较明确:
{
"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 函数中则比较难以识别错误。例如:
Unable to import module 'index': No module named index
或者,如果外部库缺少所需权限:
Unable to import module 'index': No module named exlib
修复您的部署程序包的权限
注意:这些命令仅对 Linux/Unix/macOS 系统有效。
1. (可选)通过在命令行界面 (CLI) 中运行 zipinfo,检查部署程序包文件的权限。有关更多信息,请参阅 Lambda 部署程序包上的权限策略。
2. 在 CLI 中运行以下命令,递归修复权限:
$ chmod 644 $(find /tmp/package_contents -type f)$ chmod 755 $(find /tmp/package_contents -type d)
3. 修复权限后,再次上传部署程序包。