我正在尝试部署 AWS Lambda 程序包。语言是 Python 3.6,它包括外部模块(flask-ask
,因此间接地 cryptography
)。当我这样做并测试函数时,AWS 报告错误:
No module named 'cryptography.hazmat.bindings._openssl'
我的开发环境是Windows 10。我的功能在我的开发环境上运行得很好。我用 Powershell 脚本打包函数 ...
& $pip install flask-ask -t $projectDir
...然后将结果和函数压缩成zip包。我的 Python 3.6 开发版本具有 64 位位数。
问题
为什么该函数在本地有效,但打包并发送到 AWS 时却无效? 什么东西少了?以及如何修复它。
类似问题
我发现其他人在这里也有类似的问题:
- importing cryptography.hazmat.bindings._openssl in Python 3.6 AWS Lambda Error
- When zipping a virtual env for AWS Lambda deployment, what can I leave out?
我不愿意切换到 Python 2.7。第二个只有 linux 开发环境的解决方案。
最佳答案
迟到的答案,但在 AWS Lambda 开发中需要理解的一个关键点是独立于语言的运行时环境是一个精简的 Amazon Linux 容器。具有 native 依赖项(如 cryptography
)的 Python 代码使用特定于操作系统和体系结构的二进制文件。
当您运行 pip install cryptography
时,它会在您本地计算机的上下文中运行,这意味着任何依赖的二进制文件都将根据操作系统风格和 CPU 架构进行安装。您无法将它们打包并在 AWS Lambda 环境中运行。
解决方案是使用工具从预打包的分发中组装您的依赖项(Zappa 这样做),或者执行构建步骤以在兼容环境中安装/编译依赖项(AWS SAM CLI 这样做)。
我个人更喜欢 AWS SAM CLI,但 YMMV。
关于python-3.x - 使用 Python 3.6 和密码学模块部署 AWS Lambda 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48418424/