Лямбда не загружает общую библиотеку криптографии - PullRequest
3 голосов
/ 04 апреля 2019

Я использую библиотеку криптографии в AWS Lambda. Я скомпилировал пакет, используя pip на виртуальной машине Amazon Linux. Я загрузил пакет как слой. В любом случае, каждый раз, когда я вызываю библиотеку, у меня возникает ошибка, которая не является описательной:

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-файле отсутствует библиотека, как и внутри скрытой папки. Я застегнул молнию, используя '.' вместо '*', но теперь я работаю с новой проблемой, когда я запускаю лямбду, я получил это:

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

Есть идеи?

1 Ответ

0 голосов
/ 09 апреля 2019

Поскольку используемой вами библиотеке требуются собственные библиотеки, вы должны также упаковать собственные файлы .so вместе со слоем. Я столкнулся с подобной проблемой при попытке запустить wkhtmltopdf на лямбда-aws.

Двоичные файлы для библиотеки должны быть скомпилированы в той же среде, что и лямбда-экземпляр. Lambda загружается с помощью AWS Linux.

Вы можете загрузить EC2 под управлением AmazonLinux или использовать Docker, самый простой способ - загрузить Docker-контейнер.

$ sudo docker run -it amazonlinux bash

Теперь вам нужно скачать / распаковать все .so файлы в каталог, а затем сжать его. Также убедитесь, что все .so файлы хранятся в папке с именем lib внутри zip. После архивирования он должен выглядеть примерно так:

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

Тогда вы можете просто заархивировать его и загрузить как слой. Он будет загружен в / opt / в вашем Lambda-контейнере. AWS ищет библиотечные файлы в / opt / lib среди многих других мест .

Сложной задачей для вас будет выяснить, как получить все необходимые файлы .so для правильной работы вашей зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...