【问题标题】:Lambda Not Loading Cryptography Shared LibraryLambda 未加载加密共享库
【发布时间】:2022-02-24 17:51:14
【问题描述】:

我正在使用 AWS Lambda 中的加密库。我在 Amazon Linux VM 中使用 pip 编译了该软件包。我已将包作为图层上传。无论哪种方式,每次调用该库时,都会出现一个根本无法描述的错误:

Unable to import module 'lambda_function': libffi-ae16d830.so.6.0.4: cannot open shared object file: No such file or directory

如您所见,错误不是找不到库,而是另一个我无法找到的共享模块。

这是我尝试在 Lambda 上执行的代码示例:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.fernet import Fernet

password_provided = "test123" 
password = password_provided.encode() 
salt = b'test_' 
kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=100000,
    backend=default_backend()
)
key = base64.urlsafe_b64encode(kdf.derive(password)) 


message = "message from db".encode()

f = Fernet(key)
encrypted = f.encrypt(message)

print(encrypted)

f = Fernet(key)
decrypted = f.decrypt(encrypted)

print(decrypted.decode("utf-8"))

这不是我第一次编译一个库以在 AWS Lambda 上工作,但在这种情况下,我什至编译了密码学库。我应该添加或更改什么?

编辑: 我发现我创建的 zip 文件中缺少该库,就像在隐藏文件夹中一样。我使用“。”进行压缩。而不是 '*' 但现在我遇到了一个新问题:当我运行 lambda 时,我得到了这个:

Unable to import module 'lambda_function': /opt/cryptography/hazmat/bindings/_constant_time.so: undefined symbol: PyInt_FromLong

有什么想法吗?

【问题讨论】:

  • 我不完全确定,但看起来你编译的库包含一个依赖于 libffi-ae16d830.so 的 SO 文件 - 也许检查你是否可以以某种方式将它包含在你的包中。

标签: python aws-lambda


【解决方案1】:

即使我遇到了同样的问题,在压缩时我也忘记在站点包中包含隐藏文件(.libs_cffi_backend)。 包含它之后,我没有看到这个错误。

【讨论】:

    【解决方案2】:

    由于您使用的库需要本地库,因此您必须将本地 .so 文件与层一起打包。我在尝试在 aws lambda 上运行 wkhtmltopdf 时遇到了类似的问题。

    库的二进制文件必须在与 lambda 实例相同的环境中编译。 Lambda 使用 AWS Linux 启动。

    您可以启动运行 AmazonLinux 的 EC2 或使用 docker,最简单的方法是启动 docker 容器。

    $ sudo docker run -it amazonlinux bash
    

    现在您需要将所有 .so 文件下载/解压缩到一个目录中,然后将其压缩。此外,请确保将所有 .so 文件保存在 zip 中名为 lib 的文件夹中。压缩后,zip 应该类似于以下内容:

    .
    ├── lib
    │   ├── libcrypto.so.10
    │   ├── libcrypto.so.1.0.2k
    │   ├── libfontconfig.so.1
    │   ├── libfontconfig.so.1.7.0
    .......
    

    然后您可以将其压缩并作为图层上传。它将上传到您的 Lambda 容器中的 /opt/。 AWS 在 many other locations 中的 /opt/lib 下查找库文件。

    对您来说具有挑战性的部分是弄清楚如何获取所有必需的 .so 文件以使您的依赖项正常运行。

    【讨论】:

    • .so 文件的 lib 文件夹是否应该在层 zip 的根目录中?
    【解决方案3】:

    之前我手动打包存档,使用aws cloudformation deploy 部署,并且遇到了同样的问题。然后我切换到使用sam build --use-container 并且它起作用了。我怀疑它之所以有效,是因为 SAM 使用了特定的容器。这是它使用的容器:https://gallery.ecr.aws/sam/build-python3.7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-10
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多