Вводные
Нужно
- сервис для обработки HTTP запросов с записью в БД
- с возможностью применения современных технологий
- желательно бесплатный для небольшого количества запросов (при большем объеме компенсируется прибыльностью сервиса)
В статье описываю из каких компонентов собирал прототип и источники компонентов, готовую сборку со скриншотами буду описывать после доводки инструментов до стабильного состояния, детального разбора и рефакторинга кода.
Вариант решения
Из доступных в RU сегменте выделяется Yandex со связкой
- API Gateway https://cloud.yandex.ru/docs/api-gateway/concepts/
- Cloud Functions https://cloud.yandex.ru/docs/functions/concepts/
- Yandex Database https://cloud.yandex.ru/docs/ydb/concepts/index
Осваиваю Python, универсальность, нравится синтаксис. Понравилось работать с FastAPI https://fastapi.tiangolo.com/, минимум компонентов для старта и автодокументирования, возможность подключать компоненты с разной степенью сложности.
В качестве "обертки" для работы с сервисом использую пакет Yappa https://github.com/turokg/yappa, ссылка на статью
Локальное место под Win10, PyCharm Community edition.
API Gateway
Из документации:
API-шлюз — это интерфейс взаимодействия с сервисами внутри Yandex.Cloud или в интернете.
API-шлюз задается декларативно при помощи спецификации. Спецификация — это файл в формате JSON или YAML с описанием API-шлюза по стандарту OpenAPI 3.0.
При создании точки подключения предоставляет HTTPS на техническом домене, можно подключить и свой.
Для перенаправления всех запросов на функцию используется шаблон
openapi: 3.0.0
info:
title: my-project
version: '0.1'
servers:
- url: https://d5d92t0l8j333u9rmmsk.apigw.yandexcloud.net
paths:
/{url+}:
x-yc-apigateway-any-method:
parameters:
- explode: false
in: path
name: url
required: false
style: simple
x-yc-apigateway-integration:
function_id: d4ej2iaao2mn8thstuhr
tag: $latest
type: cloud_functions
Блок servers заполняется сервисом при сохранении, в function_id указывается идентификатор функции
Cloud Functions
Из документации: "позволяет запускать ваш код в обслуживаемой среде в виде функции". Близок с "Serverless Containers" , документация "Контейнер позволяет запустить в Yandex.Cloud приложение, которое содержится в Docker-образе."
По сути предоставляется готовый контейнер с установленной исполняющей средой и возможностью установить доп. пакеты для этой среды (но не пакеты ОС).
Пример требуемого обработчика:
import json
def handler(event, context):
return {
'statusCode': 200,
'body': json.dumps({
'event': event,
}),
}
Для HelloWorld нормально, для написания приложений неудобно (банально нет отладки). Виктор Кузенный, Старший разработчик
Yandex.Cloud в "Веб-приложение на Serverless", рекомендует использовать Containers, для исключения привязки к вендору на уровне API функций. Видео только по ссылке, репозиторий с кодом (ссылка). Лезть в сборку Docker, отправку его в Registry пока желания нет.
Для того чтобы FastAPI заработал в Functions нужен handler который реализован в Yappa, заодно этот инструмент умеет деплоить локальный проект в Functions, использует oauth токен для основного пользователя директории Yandex.
Из важного для меня handler "пробрасывает" заголовок Authorization, что позволяет реализовывать аутентификацию на уровне FastAPI.
Локальная разработка
Для локального запуска приложения используется uvicorn https://www.uvicorn.org/. В корень проекта добавляю main.py
import uvicorn
if __name__ == "__main__":
uvicorn.run("app.main:app", host="127.0.0.1", port=5000, log_level="info")
Yandex Database
По сути это функциональный форк DynamoDB, по нему перевел несколько статей, ссылка поиска. Основной посыл что для быстрой работы нужно собирать данные сервиса в одну таблицу для лучшей масштабируемости, хотя можно и последовательно получать данные из нескольких таблиц.
Yandex предоставляет SDK https://github.com/ydb-platform/ydb-python-sdk, но по нему очень мало примеров использования. У DynamoDB, есть клиент boto3, по "fastapi boto3 dynamodb" нашел статьи
- https://medium.com/nerd-for-tech/introduction-to-fastapi-and-local-dynamodb-595c990ed0f8
- https://medium.com/nerd-for-tech/python-fastapi-with-aws-dynamodb-931073a87a52
Уточнил параметры подключения по статье https://habr.com/ru/post/524082/. Параметры передал в коде, будет переделано перед публикацией.
Создал таблицу для API (скриптом из статьи), задеплоил через yappa, получил рабочее приложение, с документацией https://d5d92t0l8j333u9rmmsk.apigw.yandexcloud.net/docs, можно попробовать использовать.
Итог
Работающий прототип который умеет обрабатывать HTTP запросы с возможностью расширения.
Код выложу на github после того как приведу в порядок, статью обновлю.
На сервисе-прототипе стоит лимит, при его достижении пересоберу с другими идентификаторами.
Планы использования:
- Проброс данных для Datalens, но YDB мало подходит для OLAP варианта, возможно буду использовать Postgres.
- "miniEDI", для того чтобы уменьшить порог нормального обмена каталогами и заказами между организациями
Благодарю за внимание.