Ruby gem с собственными расширениями не работает на AWS Lambda - PullRequest
0 голосов
/ 31 января 2019

У меня есть скрипт ruby, который я пытаюсь запустить на AWS Lambda.Как заставить это использовать гем Ruby с собственными расширениями?

Я установил свои камни Ruby через bundle install --deployment и включил их в свое развертывание.Когда я запускаю функцию в lambda, я получаю сообщение об ошибке:

Игнорирование oj-2.18.5, потому что его расширения не созданы.Попробуйте: gem pristine oj --version 2.18.5

Ошибка инициализации при загрузке обработчика

{

"errorMessage": "libruby.so.2.5: невозможно открыть общий объектfile: такого файла или каталога нет - /opt/ruby/gems/2.5.0/gems/oj-2.18.5/lib/oj/oj.so",

...

Я попытался включить зависимости как в сам лямбда-код, так и в качестве лямбда-слоя.Единственное, что меняется, - это путь в сообщении об ошибке.

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

/opt/ruby/gems/2.5.0/gems/oj-2.18.5/lib/oj/oj.so существует.

Я пробовал это с файлами, сгенерированными bundle install как в Ubuntu, так и в AWS-linux.В обеих системах bundle информирует меня, что это «Установка oj 2.18.5 с собственными расширениями».

Если я загружаю копию libruby.so в свою лямбду и устанавливаю переменную среды LD_LIBRARY_PATH на еерасположение и использование набора зависимостей, установленных на AWS-linux, исправляет ошибку, перечисленную выше, но только для того, чтобы сделать ошибку еще более непрозрачной:

/ lib64 / libc.so.6: версия `GLIBC_2.25 'не найден (требуется /opt/ruby/lib/libruby.so.2.5)

1 Ответ

0 голосов
/ 31 января 2019

Запуск ldd на gems / oj-2.18.5 / lib / oj / oj.so проясняет первую ошибку.проблема не в том, что oj.so не существует, а в том, что libruby.so.2.5 не существует.Вторая проблема заключается в том, что текущая Ruby-лямбда имеет версию 2.17 glibc, где AWS-linux поставляется с версией glibc 2.25.

Фундаментальная проблема здесь заключается в том, что вам нужно установить свои гемы в систему, идентичную той, в которой они работают.будет работать, если у вас есть родные зависимости.Лучший способ сделать это - использовать докер.https://github.com/lambci/docker-lambda содержит установочные образы лямбда-установок.

Для ruby ​​выполните следующие действия:

  1. Создайте образ rucker докера ruby ​​
  2. Скопируйте свой гемфайл висходный каталог
  3. Из этого каталога запустите: docker run -v "$PWD":/var/task --entrypoint bundle lambci/lambda-base:ruby2.5 install --path=/var/task

Это даст вам папку с именем ruby с зависимостями версий, совместимыми с лямбдой.

Если вы планируете использовать этот вывод с лямбда-слоями, имейте в виду, что файловая структура, создаваемая bunlde, равна ruby/2.5.0/..., и перед загрузкой она должна быть ruby/gems/2.5.0/....

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