Lambda 未加载加密共享库

Kar*_*tin 5 python aws-lambda

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,错误不是因为找不到库,而是因为我找不到另一个共享模块。

以下是我尝试在 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"))
Run Code Online (Sandbox Code Playgroud)

这不是我第一次编译在 AWS Lambda 上运行的库,但在这种情况下,我什至编译了加密库。我应该添加或更改什么?

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

Unable to import module 'lambda_function': /opt/cryptography/hazmat/bindings/_constant_time.so: undefined symbol: PyInt_FromLong
Run Code Online (Sandbox Code Playgroud)

任何想法?

小智 0

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

\n\n

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

\n\n

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

\n\n
$ sudo docker run -it amazonlinux bash\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libcrypto.so.10\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libcrypto.so.1.0.2k\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libfontconfig.so.1\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libfontconfig.so.1.7.0\n.......\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n

  • 包含 .so 文件的 lib 文件夹是否应该位于层 zip 的根目录中? (2认同)