繁体   English   中英

迁移到 AWS Lambda 上的 arm64 显示错误:无法导入模块 'encryptor-lambda'

[英]Migrate to arm64 on AWS Lambda show error: Unable to import module 'encryptor-lambda'

我有一个 lambda function 在 Python 3.7 上运行,之前架构为 x86_64。 现在我想将它迁移到 arm64 以使用 Graviton 处理器并升级到 Python 3.9。

While I success to create the Python 3.9 virtual environment layer with the dependencies that I need, which is aws-encryption-sdk , when I change the architecture of my lambda function to arm64 and runtime to Python 3.9, below error shows after I test my代码:

Unable to import module 'encryptor-lambda': /opt/python/cryptography/hazmat/bindings/_rust.abi3.so: cannot open shared object file: No such file or directory",

我去检查了我的虚拟环境层,并且很确定文件/opt/python/cryptography/hazmat/bindings/_rust.abi3.so存在于那里。

然后我尝试将我的运行时保持在 Python 3.9 并将架构切换回 x86,它可以工作。 只有当我尝试更改为 arm64 时,才会出现上述错误。

我在网上查了一下,似乎没有解决方案,或者为什么会这样。 需要依赖的 lambda 函数不能迁移吗? 还是我错过了什么?

任何帮助将不胜感激。 谢谢你。

aws-encryption-sdk-python这样的库有时包含不是纯 Python 并且需要编译的代码/依赖项。 当需要“编译”代码时,通常会针对目标架构(如 ARM 或 x86)进行编译以正常运行。


您不能在不同架构上运行为一种架构编译的代码。 所以我怀疑这是你错误的原因。


查看错误消息,我怀疑是密码库导致了这个问题。

该库使用 Rust。 如果您检查错误,您将看到 Rust 绑定的共享库是导致错误的原因 ( _rust.abi3.so )。 根据库的文档,支持 ARM 架构。

因此,我怀疑您打包 Lambda 部署 package 的方式及其依赖关系是问题所在。 您可能正在使用 x86 架构的计算机上执行此操作。 Package 管理器(如pip通常检测它们运行的操作系统和架构,并下载这些操作系统和架构的依赖项。

所以我想你有两个选择:

  1. 在 ARM 机器上运行您的构建/部署
  2. 不知何故设法使用crossenv之类的工具“交叉编译”

这两种选择都不是很好。

不幸的是,这是 Python Lambda 开发/部署可能变得非常麻烦的领域之一。 每次依赖使用非 Python 扩展(如 C 扩展)时,打包/部署都会成为问题。

也许其他人有一个很棒的工具可以推荐。

Jens 给出的答案是正确的。 但更简洁地说,您在 x86_64 上构建了您的环境并下载了 x86_64 轮子进行密码学。 您需要在 Arm 上构建环境以部署在 Arm 上。

您可以考虑的另一个选择是使用 Docker buildx 为使用 qemu 仿真的两个平台构建,只要构建不需要很长时间。 仿真大大减慢了速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM