Yappa: запускаем python web-приложения. Просто. Бессерверно. В Яндекс Облаке

от автора

Без лишних слов… Yappa

$ pip install yappa $ pip freeze > requirements.txt
$ yapa setup $ yappa depoy

Все. 

Твое python приложение доступно в яндекс облаке, у него есть свой урл, оно готово к любому наплыву посетителей. А платишь ты только за время цпу, затраченное на обработку запросов

Пара слов о серверлесс

Запуская приложения серверлесс, ты платишь за использованные ресурсы, а масштабирование берет на себя облачный провайдер. Ты не заводишь виртуальные машины, не настраиваешь оркестраторы, не платишь за все это это дело во время простоя. Серверлесс подход позволяет команде разработки сфокусироваться на программировании логики приложения, а деньги за облако уходят только на обслуживание запросов пользователей.

Серверлесс функция —  просто функция, которая принимает определенные аргументы и возвращает ответ определенного формата.

 def handler(event, context):     return {         'statusCode': 200,         'body': json.dumps({             'event': event,         }),     }

После создания версии функции в облаке, интерпретатор питона с импортированными зависимостями крутится и ждет пока к нему прилетит запрос.

Несмотря на то что веб приложение и функция чем-то схожи, просто так веб-приложение запустить бессерверно не получится: для веб приложения надо запустить веб сервер, который будет прослушивать порт в ожидании запроса, а функция — просто функция. Не очень понятно как делать отладку, тестировать, запускать локально и прочее… 

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

Хотелось чтобы для серверлес запуска не надо было менять код. Максимум — дополнительный файл конфигов наравне с docker-compose.yaml.

Немного о Yappa

На просторах гитхаба есть инструменты для aws, но для яндекса нашел только Yappa. Проект был написан два года назад и успешно заброшен. С тех пор в Яндекс Облаке появилась поддержка апи-гейтвея, что сделало возможным деплой приложения с более чем одним роутом. Было решено делать первые шаги в опенсорс: перетянуть на себя развитие проекта, добавить поддержку апи-гейтвей, чуть изменить логику обработки запроса и забрать аутентификацию внутрь своего cli, отказавшись от использования yandex cli. 

Сейчас Yappa поддерживает любое WSGI/ASGI приложение (привет, Flask, Django, FastAPI). При деплое Yappa:

  • упаковывает проект: собирает в архив код твоего приложения, хендлеры и зависимости из requirements.txt, заливает в s3

  • создает версию функции, указывая на нужный хендлер

  • обновляет апи-гейтвей

Апи гейтвей по умолчанию настроен переадресовывать любые запросы по любому урлу в функцию.

Хендлер — и есть точка входа, бессерверная функция. На старте в облаке он читает путь до твоего приложения из yappa.yaml, загружает приложение и ждет.  Далее при поступлении ивента, он формирует из него http-запрос и скармливает его уже загруженному wsgi/asgi приложению.

С помощью связки гейтвей+функция+с3 можно запускать не только классический json API, можно реализовать и классическое джанго приложение и SPA, перенаправляя запросы за статикой в с3. Чуть позже добавим в репозиторий примеры таких деплоев.

Для первого запуска в облаке требуется сделать две команды

  • $ yappa setup — разбираемся с каталогом и облаком, в котором будем запускать приложения. Создаем сервисный аккаунт, от имени которого будут делаться все следующие манипуляции (ключ сохраняется локально в файлик .yc)

  • $ yappa deploy — спрашивает тебя о проекте (имя, название бакета, тип приложение и его путь). Сохраняет настройки  в yappa.yaml. Создает функцию и версию функции. Сохраняет файл настроек апи-гейтвея в yappa_gw.yaml, создает гейтвей.

При изменении кода, для обновления приложения нужно выполнить 

  • $ yappa deploy — создается новая версия функции, на всякий случай обновляется апи гейтвей.

Ограничения

Подключение к базам данных

Внутри сети Яндекс Облака поддерживается только подключения к YDB. В целом, можно написать приложение с использованием его, на голом SQL…или вытащить базу наружу… Пару недель назад добавили поддержку Postgres в режиме превью, скоро и Yappa подтянется, следите за обновлениями.

Асинхронные задачи

Какой либо поддержки задач нет. Есть пара идей как это реализовать, возможно добавим как руки дойдут, stay tuned.

Дальнейшие планы

На данный момент Yappa как инструмент вполне готов. После того как разберемся с поддержкой managed Postgres, в планах есть небольшие плюшки cli, и добавления примеров деплоя. Но есть пара мыслей на довольно объемные задачи, для которых надо поднакопить вдохновение.

В отличие от aws и gcp, бессерверная база яндекс является реляционной. А это значит, что можно сделать полноценное приложение, без ограничений document based баз, в серверлесс режиме, с оплатой только за операции. К сожалению, функционал YDB имеет ряд ограничений, синтаксис  запросов местами отличается. Но теоретически…  если реализовать поддержку YDB для Django ORM… можно будет запускать джанго приложения без почасовой оплаты. Не знаю, дойдут ли у меня руки ввязаться в эту историю, но если подтянется пара единомышленников, уверен, будет легче 🙂

С пожеланиями и предложениями — велкам в телеграм чат.


ссылка на оригинал статьи https://habr.com/ru/articles/569674/