Скрипт работает на AWS EC2, но не на AWS Lambda после архивирования.

Я создаю простую функцию AWS Lambda с использованием библиотеки M2Crypto. Я выполнил шаги по созданию пакета развертывания из здесь. Лямбда-функция отлично работает в экземпляре EC2 Linux (AMI).

Это мое определение функции:

CloudOAuth.py

from M2Crypto import BIO, RSA, EVP
def verify(event, context):
  pem = "-----BEGIN PUBLIC KEY-----\n{0}\n-----END PUBLIC KEY-----".format("hello")
  bio = BIO.MemoryBuffer(str.encode(pem))
  print(bio)
  return 

Структура пакета развертывания:

Скелет пакета развертывания Lambda

Когда я запускаю Lambda, у меня возникает следующая проблема, и я также пытался включить libcrypto.so.10 из каталога / lib64, но не помогло.

Проблема при запуске Lambda

/var/task/M2Crypto/_m2crypto.so: символ sk_deep_copy, версия libcrypto.so.10 не определена в файле libcrypto.so.10 со ссылкой на время ссылки`

Python: 2.7
M2Crypto: 0.27.0

person imechemi    schedule 05.12.2017    source источник
comment
Не могли бы вы отметить мой ответ как принятый, если это так, пожалуйста.   -  person mcepl    schedule 13.12.2017
comment
Конечно, спасибо! и я добавил еще несколько деталей для такого новичка, как я.   -  person imechemi    schedule 14.12.2017
comment
да, я понятия не имею о EC2, так что это очень полезно. Спасибо.   -  person mcepl    schedule 15.12.2017


Ответы (3)


Я предполагаю, что M2Crypto был построен с другой версией OpenSSL, чем та, что на Lambda. См. соответствующий код. Если нет (здесь говорит сопровождающий апстрима), сообщите об ошибке на странице https://gitlab.com/m2crypto/m2crypto/issues

person mcepl    schedule 06.12.2017

Я просто хочу добавить более подробную информацию к ответу @mcepl. Наиболее важным является то, что версия OpenSSL на AWS Lambda и среда (в моем случае ec2), в которой вы создаете свою библиотеку M2Crypto, должны совпадать.

Чтобы проверить версию openssl на Lambda, используйте print в своем обработчике:

print(ssl.OPENSSL_VERSION)

Чтобы проверить версию openssl в вашей среде сборки, используйте:

$ openssl version

Как только они совпадают, все работает.

Не стесняйтесь понижать или обновлять OpenSSL в своей среде сборки, чтобы она соответствовала среде Lambda. Мне пришлось понизить версию моего openssl на ec2, чтобы соответствовать среде выполнения лямбда.

sudo yum -y downgrade openssl-devel-1.0.1k openssl-1.0.1k

Надеюсь, это поможет любому, кто пытается использовать M2Crypto :)

person imechemi    schedule 14.12.2017

копирование моего ответа на аналогичный вопрос здесь:

AWS lambda запускает код в старой версии amazon linux (amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2), как указано в официальной документации https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html

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

Что я обычно делаю в таких случаях, так это то, что я создаю virtualenv с помощью контейнера докеров. Затем virtualenv может быть упакован с помощью лямбда-кода.

Обратите внимание, что если вам нужно установить что-либо с помощью yum (в контейнере docker), вы должны использовать тот же сервер выпуска, что и версия amazon linux:

yum --releasever=2017.03 install ...

virtualenv также может быть построен с использованием экземпляра EC2 вместо контейнера докеров (хотя я считаю, что метод докеров проще). Просто убедитесь, что AMI, используемый для EC2, такой же, как тот, который используется лямбда.

person Omer Akhter    schedule 04.04.2019