【问题标题】:AWS Lambda Python Cryptography - Cannot open shared object filesAWS Lambda Python Cryptography - 无法打开共享对象文件
【发布时间】:2021-08-11 05:33:27
【问题描述】:

我正在开发一个部署到 AWS Lambda 的无服务器 Flask 应用程序。该程序使用 Cryptography 库(使用版本 3.4.7)。在本地,该程序运行良好,没有任何问题。但是,无论何时部署在 Lambda 上,都会出现以下错误:

from cryptography.fernet import Fernet

File "/var/task/cryptography/fernet.py", line 16, in <module>

from cryptography.hazmat.primitives import hashes, padding

File "/var/task/cryptography/hazmat/primitives/padding.py", line 11, in <module>

from cryptography.hazmat.bindings._padding import lib

ImportError: /var/task/cryptography/hazmat/bindings/_padding.abi3.so: cannot open shared object file: No such file or directory

并且在使用“有害物质”模块中的一些必需功能时,会出现非常相似的错误:

File "/var/task/cryptography/hazmat/primitives/kdf/pbkdf2.py", line 28, in __init__
    backend = _get_backend(backend)
File "/var/task/cryptography/hazmat/backends/__init__.py", line 23, in _get_backend
    return default_backend()
File "/var/task/cryptography/hazmat/backends/__init__.py", line 14, in default_backend
    from cryptography.hazmat.backends.openssl.backend import backend
File "/var/task/cryptography/hazmat/backends/openssl/__init__.py", line 6, in <module>
    from cryptography.hazmat.backends.openssl.backend import backend
File "/var/task/cryptography/hazmat/backends/openssl/backend.py", line 113, in <module>
    from cryptography.hazmat.bindings.openssl import binding
File "/var/task/cryptography/hazmat/bindings/openssl/binding.py", line 14, in <module>
    from cryptography.hazmat.bindings._openssl import ffi, lib
ImportError: /var/task/cryptography/hazmat/bindings/_openssl.abi3.so: cannot open shared object file: No such file or directory

但是,引用的库文件确实存在,并且它们位于指定的确切路径中。

该应用在 requirements.txt 中包含 cryptography==3.4.7 作为依赖项。然后,Serverless 在使用 sls deploy 部署到 AWS 时安装这些包。无服务器将所有内容放在一个 zip 中并将其上传到 AWS。我可以按预期看到这个 zip 文件夹中的所有文件。

我认为这可能是无服务器在部署时错误地上传或安装软件包的问题,​​因此我什至尝试将密码学文件夹直接包含在我的项目中。但是,尽管对无服务器配置或加密程序包本身进行了任何更改,但我在部署的 Lambda 上使用此程序包并没有成功。有没有人知道我可以做些什么来完成这项工作?

【问题讨论】:

  • 您必须明确说明您是如何使用这些依赖项创建函数或层的。
  • 我添加了一些关于部署的信息。使用 sls deploy,所有包都被添加到应用程序的 zip 文件夹中并上传。非常感谢任何帮助!

标签: python amazon-web-services aws-lambda serverless-framework python-cryptography


【解决方案1】:

我之前遇到过类似的问题,通过在 linux 机器上运行部署命令解决了这个问题。我使用 mac 进行开发,我试图从我的 mac 部署我的 lambda 函数。但是,在部署时,一些依赖项引发了导入错误。

根据我的经验,这是由于操作系统在 mac 或 linux 环境中运行时对依赖项的打包方式不同。因此,请尝试在 linux 机器中运行 serverless 部署命令,看看是否可行。

在我的例子中,我设置了一个 gitlab CI/CD 管道来在 gitlab 管道环境中运行命令并解决了问题。

【讨论】:

  • 我目前正在从 linux 系统进行部署。我能想到的唯一可能会有所不同的是我的机器有一个 ARM 处理器。我将不得不尝试不同的设置。谢谢!
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 2011-12-23
  • 2012-12-15
  • 2013-04-21
  • 2013-05-05
  • 2018-12-15
  • 1970-01-01
  • 2017-05-21
相关资源
最近更新 更多