Назад | Перейти на главную страницу

Упаковка Python (passlib, argon2) для AWS Lambda

Я пытаюсь создать функцию Python для AWS Lambda, которая использует passlib библиотека для хеширования паролей с argon2. С этой целью я использую pip чтобы установить следующие пакеты в локальный каталог, заархивировать их с моим файлом Python и загрузить в Lambda:

passlib==1.7.1
argon2-cffi==18.1.0
cffi==1.11.5
pycparser==2.18
six==1.11.0

Этих пакетов достаточно, чтобы я мог использовать argon2 через passlib в моей локальной среде Ubuntu. Однако при тестировании в Lambda я продолжаю получать следующую ошибку:

  File "/var/task/my-function.py", line 41, in handler
    if argon2.verify(password, hash):
  File "/var/task/passlib/handlers/argon2.py", line 525, in verify
    cls._stub_requires_backend()
  File "/var/task/passlib/utils/handlers.py", line 2221, in _stub_requires_backend
    cls.set_backend()
  File "/var/task/passlib/utils/handlers.py", line 2143, in set_backend
    raise default_error
passlib.exc.MissingBackendError: argon2: no backends available -- recommend you install one (e.g. 'pip install argon2_cffi')

В консоли Lambda кажется, что все загружается должным образом.

В идеале я хотел бы знать, как правильно упаковать мое приложение Python для Lambda, но я также согласен с другими способами сделать argon2 или bcrypt хеширование паролей и проверка хеширования в Lambda. Заранее спасибо за помощь!

Оказывается, я не включил все необходимые файлы при создании архива .zip, как описано здесь: https://stackoverflow.com/questions/38963857/import-error-from-cyptography-hazmat-bindings-constant-time-import-lib

В процессе отладки я создал среду Amazon Linux для установки / компиляции библиотек для максимальной совместимости с Lambda. Итак, мой процесс упаковки лямбда-функций теперь выглядит так:

  1. Развивайте среду Amazon Linux (например, Docker).
  2. Использовать yum установить zip, libffi-devel, желаемая версия Python (я использовал python36), и virtualenv.
  3. Создайте и активируйте виртуальную среду. Установите все пакеты Python с помощью pip.
  4. Создайте архив .zip, включающий функцию Lambda и все пакеты сайта из виртуальной среды. Например:

    zip -9 lambda.zip myfunction.py
    cd venv/lib/python3.6/site-packages/
    zip -r9 ../../../../lambda.zip .
    cd ../../../lib64/python3.6/site-packages/
    zip -r9 ../../../../lambda.zip
    
  5. Загрузить lambda.zip в AWS Lambda.