Как создать функцию 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/).