Yappa: Запуск Веб-Приложений Python. Только. Бессерверный. В Яндекс Облаке

Без лишних слов… Яппа

  
  
   

$ pip install yappa $ pip freeze > requirements.txt



$ yapa setup $ yappa depoy

Все.

Ваше Python-приложение доступно в облаке Яндекса, имеет собственный URL и готово к любому наплыву посетителей.

И вы платите только за время процессора, потраченное на обработку запросов.



Несколько слов о бессерверных технологиях

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

Вы не запускаете виртуальные машины, не настраиваете оркестраторы и не платите за всё это во время простоя.

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

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



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

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

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

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

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

Я хотел, чтобы бессерверная система работала без необходимости изменения кода.

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

Немного о Яппе

На гитхабе есть инструменты для aws, но для яндекса я нашел только Yappa. Проект был написан два года назад и успешно заброшен.

С тех пор в Yandex Cloud добавлена поддержка API-шлюза, что позволило развернуть приложение с более чем одним маршрутом.

Было решено сделать первые шаги в open source: взять на себя разработку проекта, добавить поддержку API-шлюза, немного изменить логику обработки запросов и взять аутентификацию внутри своего cli, отказавшись от использования яндекс-кли.

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

При развертывании Яппа :

  • упаковывает проект: собирает код вашего приложения, обработчики и зависимости из require.txt в архив, загружает на s3
  • создает версию функции, указывающую на нужный обработчик
  • обновляет API-шлюз
API-шлюз по умолчанию настроен на перенаправление любых запросов на любой URL-адрес функции.

Обработчик — это точка входа, бессерверная функция.

При запуске в облаке он считывает путь к вашему приложению из yappa.yaml, загружает приложение и ждет. Затем при поступлении события формирует из него http-запрос и передает его уже загруженному приложению wsgi/asgi. Используя комбинацию шлюз+функция+c3, вы можете запустить не только классический json API, вы также можете реализовать классическое приложение Django и SPA, перенаправляя запросы статических данных в c3. добавим чуть позже репозиторий примеры таких развертываний.

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

  • $yappa setup — выясняем каталог и облако, в котором будем запускать приложения.

    Создаем сервисную учетную запись, от имени которой будут производиться все следующие манипуляции (ключ сохраняется локально в файле .

    yc)

  • $yappa Deploy — спрашивает вас о проекте (имя, имя корзины, тип приложения и путь к нему).

    Сохраняет настройки в yappa.yaml. Создает функцию и версию функции.

    Сохраняет файл настроек API-шлюза в yappa_gw.yaml, создает шлюз.

Если код изменится, для обновления приложения нужно запустить
  • $yappa Deploy — создается новая версия функции, на всякий случай обновляется API шлюза.



Ограничения



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

В сети Yandex Cloud поддерживаются только подключения к YDB. В общем, на нем можно написать приложение, на голом SQL. или вытащить базу наружу.

Пару недель назад добавили поддержку Postgres в режиме предварительного просмотра, скоро Yappa подтянется, следите за обновлениями.



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

Нет поддержки задач.

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



Планы на будущее

На данный момент Yappa как инструмент вполне готов.

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

Но есть пара мыслей по поводу довольно объемных задач, для которых нужно накопить вдохновение.

В отличие от aws и gcp, бессерверная база данных Яндекса является реляционной.

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

К сожалению, функциональность YDB имеет ряд ограничений; синтаксис запроса в некоторых местах отличается.

Но теоретически.

если вы реализуете поддержку YDB для Django ORM. можно будет запускать приложения Django без почасовой оплаты.

Не знаю, сойду ли я ввязываться в эту историю, но если найдется парочка единомышленников, уверен, будет проще :) С пожеланиями и предложениями - добро пожаловать телеграмма чат .

Теги: #python #Serverless #fastapi #CLI #flask #django #serverless

Вместе с данным постом часто просматривают: