Как создать функцию AWS Lambda с Python 3.7 (правильный путь)
В этой короткой статье мы увидим, как лучше всего создать приложение Python 3.7, которое работает на AWS Lambda и требует дополнительных пакетов (например, urlib3, pyyaml, запросов).
Примечание: эта статья требует минимального знания Docker, AWS Lambda и, конечно же, Python.
Отказ от ответственности: все мысли и мнения принадлежат мне.
AWS Lambda и Python
AWS Lambda в настоящее время поддерживает три версии Python с конкретными средами выполнения.
Из приведенного выше списка ясно, что каждая среда выполнения Python использует Amazon Linux, дистрибутив, который произошел от CentOS и Red Hat Enterprise Linux (RHEL).
Чем полезна эта информация?
Это полезно, потому что, если мы используем внешний пакет в нашем приложении Python, он должен быть совместим с этим конкретным дистрибутивом Linux (см. что за pip здесь: «https://pydist.com/blog/pip- установить").
Основная «проблема» в том, что у нас нет контроля над тем, что можно установить в среде Lambda из-за ее бессерверной природы (что является огромным преимуществом с точки зрения управления облаком).
Решение простое: объедините и отправьте наши скрипты и пакеты вместе.
Принимая во внимание приведенную выше информацию, следующим естественным шагом является сборка и сборка всего приложения с использованием образа AWS Docker Amazon Linux 2018.03 (https://hub.docker.com/_/amazonlinux)
Создайте среду разработчика
В этом разделе мы увидим, как настроить с нуля нашу среду Python 3.7 с помощью образа AWS Docker.
Давайте начнем с создания Dockerfile на основе образа Amazon Linux, а затем добавим несколько строк для установки Python 3.7 и pip.
FROM amazonlinux:2018.03 RUN yum update -y RUN yum install -y \ gcc \ openssl-devel \ zlib-devel \ libffi-devel \ wget && \ yum -y clean all WORKDIR usr/src # Install Python 3.7 RUN wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz RUN tar xzf Python-3.7.4.tgz RUN cd Python-3.7.4 ; ./configure --enable-optimizations; make altinstall RUN rm Python-3.7.4.tgz RUN rm -rf Python-3.7.4 RUN python3.7 -V # Install pip RUN wget https://bootstrap.pypa.io/get-pip.py RUN python3.7 get-pip.py RUN rm get-pip.py RUN pip -V
Наконец, мы можем создать наш образ с помощью следующей команды, где amazonlinux-py3.7 - произвольный тег изображения.
docker build -t amazonlinux-py3.7 .
Полный пример
Давайте попробуем создать простую функцию, которая вызывает API и возвращает ответ.
Из терминала мы можем создать локальную папку для этого проекта, а затем переместиться в нее.
mkdir lambda_python cd lambda_python
Внутри каталога нашего проекта мы можем создать файл с именем lambda_function.py со следующим кодом:
import requests def lambda_handler(event, context): response = requests.get('https://api.github.com') return response.content
Функция с именем lambda_handler является функцией-обработчиком, которую Lambda вызывает при вызове функции.
(для получения дополнительной информации см .: https://docs.aws.amazon.com/ lambda / latest / dg / python-programming-model.html )
Функция в ее нынешнем виде не будет работать, потому что нам нужно сначала установить пакет request.
Чтобы выполнить оператор импорта, мы должны открыть сеанс ssh в нашем ранее созданном контейнере Docker с помощью:
docker run -v $(pwd):/my_project -ti amazonlinux-py3.7
и установите пакет requests в каталог нашего проекта с помощью:
pip install requests -t /my_project
Содержимое нашей папки проекта должно выглядеть так:
Давайте закроем ssh-соединение (напишите в терминале exit) и перейдем к следующему шагу.
Объедините и разверните на AWS
Чтобы создать наш пакет, мы должны сжать в файл .zip все содержимое каталога нашего проекта, пакетов и сценария .py.
Перейдем в папку нашего проекта (lambda_python) и выполним следующую команду:
zip -r my_lambda.zip *
Наконец, мы готовы создать и развернуть нашу лямбда-функцию.
На панели инструментов AWS Lambda мы можем нажать «Создать функцию».
Затем выберите «Автор с нуля», введите имя функции и выберите Python 3.7 в качестве среды выполнения. Наконец, мы можем нажать «Создать функцию».
Почти посередине страницы в разделе «Код функции» мы должны выбрать «Загрузить файл .zip» из раскрывающегося списка, затем с помощью кнопки «Загрузить» мы можем загрузить my_lambda.zip ранее созданный файл, а затем нажмите «Сохранить» (вверху справа).
Отличная работа!! наша лямбда-функция готова к тестированию.
Тестирование
На панели инструментов AWS Lambda мы можем щелкнуть «тест» (вверху справа) и настроить базовое тестовое событие (см. Рисунок ниже).
Если мы выделим файл lambda_function.py в веб-редакторе и нажмем «тест», мы должны увидеть вкладку «Результат выполнения» с выводом вызова.
Окончательное рассмотрение
С помощью подхода, описанного в этой статье, можно создать и упаковать любой тип лямбда-функции, но ...
Прежде чем продолжить работу над каким-либо проектом, давайте узнаем об основных ограничениях AWS Lambda в настоящее время:
Пакет развертывания:
- размер 50 МБ (в архиве, для прямой загрузки)
- 250 МБ (в разархивированном виде, включая слои)
- 3 МБ (консольный редактор)
Тайм-аут функции: 900 секунд (15 минут)
[Полный список здесь: https://docs.aws.amazon.com/lambda/latest/dg/limits.html]
Если размер пакета .zip превышает поддерживаемый размер, есть как минимум две другие альтернативы:
A) Объедините остальные (или часть) файлов / пакетов в корзину S3 и разверните основной обработчик .py в Lambda. Главный обработчик для каждого вызова должен загружать и использовать файлы S3 (пример здесь). Это возможно, поскольку текущая функция Lamda и хранилище слоев составляют 75 ГБ, но могут вызвать некоторые проблемы с производительностью.
Б) Рассмотрим AWS Fargate (https://aws.amazon.com/fargate/).