Рубрики
Без рубрики

Как коготь выхода из AWS LAMBDA Функциональный ад, используя силу докера

Автор оригинала: FreeCodeCapm Team.

Лиз риса

Когда вы создаете функции лямбда, легко попасть в ловушку в кошмаре «Неверный заголовок эльфа». Проблема в том, что ваши двоичные файлы созданы для неправильной платформы. Вот что происходит, и как вы можете легко исправить, используя Docker.

Когда большинство людей начинаются с функциями лямбда, они будут использовать онлайн-редактор в консоли для ввода их кода. Это хорошо для вашего первого примера или двух, но в ближайшее время вы захотите сделать что-то дикое и сумасшедшее, как, y’know, импортируйте библиотеку.

За последние несколько выходных я работал на Мой первый навык Alexa для Amazon Echo И я достиг этого момента, где я хочу использовать третий код, чтобы добавить некоторые дополнительные функциональные возможности.

Онлайн-редактор просто позволяет редактировать один файл. Если вы хотите обратиться к другим файлам – включая импортированные библиотеки – вы можете загрузить их в ZIP-файл (Amazon называют этот пакет развертывания ). Но если вы работаете на компьютере Mac или Windows, есть улов.

Когда вы используете PIP для установки библиотек Python на вашем ноутбуке, он дает вам двоичные файлы (файлы .so), которые создаются для запуска на вашем компьютере. Но когда функция лямбда работает в облаке AWS, она будет работать на Linux – и двоичные файлы, созданные для Mac (они часто называют сборки «Дарвина») или Windows не будет работать на Linux (и наоборот).

Если вы загружаете версию MAC, вы увидите «Неверный заголовок ELF», когда вы пытаетесь проверить функцию лямбда.

Таким образом, вам нужно понадобиться версии Linux из этих файлов библиотеки. Но что, если у вас нет коробки Linux вручную?

Вы можете схватить себя экземпляром EC2 из Amazon (или капельку на цифровом океане или любого вида в виртуальности в Linux ваших предпочтений), но на мой взгляд, это довольно выступление, и может даже стоить вам немного денег (особенно если вы забудете Возьмите коробку EC2 снова, когда вам это не нужно).

Я думаю, что самое простое решение – использовать Docker.

Подход докера

С Докер Вы можете очень легко можете запустить контейнер Linux локально на вашем Mac, установите библиотеки Python в контейнере, чтобы они автоматически находились в правильном формате Linux, и нажимает на молнии, готовые к загрузке на AWS. Вам понадобится Docker для Mac (или Windows) установлен первый.

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

docker run -v :/working -it --rm ubuntu
  • -V Флаг делает ваш код код доступен внутри контейнера в каталоге, называемом «Работа».
  • -итайте Флаг означает, что вы должны взаимодействовать с этим контейнером.
  • --rm Флаг означает, что Docker удалит контейнер, когда вы закончите.
  • Ubuntu Название официального контейнера, содержащего, вы догадались, Ubuntu. Если этот контейнер изображения еще не на вашем компьютере, Docker скачат его для вас.

Теперь вы должны быть внутри контейнера в оболочке подсказки, глядя что-то подобное:

root@c1996f32a397:/#

Установите PIP и ZIP:

$ apt-get update$ apt-get install python-pip$ apt-get install zip

Перейдите в рабочий каталог (вы должны иметь возможность увидеть ваш код функции Lambda здесь):

$ cd working

Используйте PIP, чтобы получить интересующую вас библиотеку/IES. Вы можете использовать флаг -t, чтобы сообщить PIP, чтобы поставить библиотеки здесь в текущем каталоге, который будет более удобным позже, поскольку он будет там, где пакет развертывания AWS хочет их быть:

$ pip install -t . 

Если вам очень любопытно, вы можете взглянуть, чтобы посмотреть, что это устанавливает. В моем собственном случае я установил editdistance Библиотека, которая дала мне следующие дополнительные каталоги и файлы.

editdistance:__init__.py __init__.pyc _editdistance.h bycython.so def.h
editdistance-0.3.1.dist-info:DESCRIPTION.rst INSTALLER METADATA RECORD WHEEL metadata.json top_level.txt

Вы можете увидеть, что файл bycython.so? Это правильная версия бинара в Linux, которую AWS был возражен, когда я ударил неверный заголовок эльфа (показан на скриншоте журнала ошибок выше).

Создайте ZIP-файл с помощью кода лямбда (в моем случае один файл называется lambda_function.py) и библиотеки (для меня, два каталогов редактирования и их содержание.

$ zip linux-lambda.zip lambda_function.py
$ zip -r linux-lambda.zip edit*

-R Флаг на молнии говорит ему рекурсивно добавить содержимое каталогов.

Теперь у вас есть архивный файл под названием Linux-lambda.zip, который готов к загрузке на AWS. И поскольку каталог установлен с хоста (ваш MAC) в контейнер, вы можете просто загрузить файл в консоль.

Вернуться в тип терминала Выход Чтобы выйти из контейнера, и это будет так, как будто он никогда не существовал, за исключением существования файла Linux-lambda.zip, который все еще доступен на хосте.

Загрузите ZIP-файл в консоли, сохраните его и попробуйте запустить тест. Неверный ELF заголовок ошибки не более!

Если эта статья поможет вам, пожалуйста, нажмите? Кнопка, чтобы другие люди было легче найти его. Если вам действительно нравится, почему бы не пойти бананы и поделиться этим тоже?

Я написал несколько других постов о том, что я изучаю, как я пишу свой первый навык Alexa, как этот, где я Добавить возможности хранения данных в мою функцию лямбда Отказ Если вы найдете их полезными, вы можете быть заинтересованы в книге, которую я пишу под названием Приключения с Алексией Отказ Выберите свою собственную цену!