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

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

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

当我成功创建 Python 3.9 虚拟环境层时,我需要的依赖项是 aws-encryption-sdk,当我将 lambda 函数的架构更改为 arm64 并将运行时更改为 Python 3.9,我测试我的代码后显示以下错误:

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的code/dependencies,需要编译。当需要“编译”代码时,通常会针对目标体系结构(如 ARM 或 x86)将其正确编译为 运行。


您不能运行 为不同体系结构编译的代码。所以我怀疑这就是你出错的原因。


查看错误消息,我怀疑是 cryptography library 导致了此问题。

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

因此,我怀疑您打包 Lambda 部署包的方式及其依赖项是问题所在。您可能在具有 x86 体系结构的计算机上执行此操作。 pip 之类的包管理器通常会检测 OS 和它们所处的架构 运行 并下载那些 OS 和架构的依赖项。

所以我猜你有两个选择:

  1. 运行 你的 build/deployment 在 ARM 机器上
  2. 以某种方式设法使用 crossenv
  3. 等工具“交叉编译”

这两个选项都不是很好。

不幸的是,这是 Python Lambda 对 develop/deploy 来说变得非常麻烦的领域之一。每次依赖项使用非 Python 扩展(如 C 扩展)时,packaging/deployment 就会成为问题。

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

延斯给出的答案是正确的。但更简洁地说,您在 x86_64 上构建了环境并下载了 x86_64 wheel 用于加密。需要在Arm上搭建环境才能在Arm上部署。

您可以考虑的另一个选择是使用 Docker buildx 在使用 qemu 仿真的情况下为两个平台构建,只要构建不会花费很长时间。仿真会显着降低速度。