Руководство по запуску Serverless-приложений

В конце прошлого года мы запустили в бета-тестирование нашу Serverless-услугу Облачные функции. В этом коротком руководстве на примере Flask-приложения расскажем, как начать использовать новый сервис.

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

Новый сервис отлично справится с автоматизацией фоновых задач (отправкой писем, генерацией скриншотов или работой с API), вычислениями на статичных сайтах, ETL-процессами и бэкендом для API и мобильных приложений.

Подготовка окружения

Все нижеперечисленные команды нужно выполнять на виртуальной машине.

Подготовьте виртуальную машину с CouchDB и тестовым приложением в контейнере, используя Docker.

Готовим виртуальную машину

Установка и запуск Docker

Обновите репозитории:

sudo apt-get update

Удалите пакеты Docker, установленные по умолчанию:

sudo apt-get remove docker docker-engine docker.io

Инсталлируйте Docker:

sudo apt install docker.io

Запустите Docker в качестве демона:

sudo systemctl start docker

Установка образа

Скачайте Docker образ CouchDB:

docker pull couchdb

Скачайте наш пример Flask-приложения:

docker pull selectel/shiny-flask-app

Запустите контейнер с CouchDB:

docker run -e COUCHDB_USER=user -e COUCHDB_PASSWORD=password -p0.0.0.0:5984:5984/tcp -d couchdb

Запустите контейнер с shiny-flask-app:

docker -v run --rm -e server_url=XXX.XXX.XXX.XXX:5984  -e admin_username=user -e admin_password=password -p0.0.0.0:2020:2020/tcp -d selectel/shiny-flask-app

Где server_url - это Floating IP вашей виртуальной машины и порт, на котором слушает CouchDB, а admin_username и admin_password эквиваленты COUCHDB_USER и COUCHDB_PASSWORD соответственно.

Готовим базу данных

Создайте в CouchDB новую базу данных под названием Products, для чего используйте следующую команду:

curl -u user:password -X PUT http://<couchdb_ip>:5984/products

Где couchdb_ip — Floating IP виртуальной машины, на которой запущены контейнеры.

Используя API приложения создайте в CouchDB запись:

curl -v -X POST -d '{"_id": "xxxx", "name": "product1"}' -H "Content-Type: application/json" -u user:password XXX.XXX.XXX.XXX:2020/v1.0/products/createProduct

Где XXX.XXX.XXX.XXX — IP адрес виртуальной машины, на которой поднят Docker контейнер.

Проверить, что запись в базе создана, можно используя этот запрос:

curl -v -H "Content-Type: application/json" XXX.XXX.XXX.XXX:2020/v1.0/products/xxxx

Работа с проектом

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

Назовите проект.

Перейдите в созданный проект.

Перейдите на вкладку Функции.

Нажмите Создать функцию.

Укажите имя функции и нажмите Создать функцию.

Нажмите Редактировать, чтобы загрузить код и настроить функцию.

Скачайте репозиторий с кодом.

Создайте архив с кодом функции, находясь в корневой директории репозитория:

tar -cvf shiny_flask_app.tar

Загрузите архив с кодом приложения из нескольких файлов или файл с кодом функции.

Укажите путь к файлу с кодом в архиве: /shiny_flask_app/api/products.py

Укажите название вызываемой функции.

Добавьте переменные окружения с помощью кнопки Добавить.

Первая переменная, которая нам необходима, admin_username. Присвойте ей значение user.

Таким же образом присвойте еще две необходимые переменные: admin_password и server_url со значениями password и XXX.XXX.XXX.XXX:5984 соответственно.

Остановимся подробнее на server_url — это IP-адрес виртуального сервера с запущенным CouchDB и порт, на котором CouchDB слушает запросы.

Далее сохраните введенную информацию и разверните функцию с помощью кнопки Сохранить и развернуть.

Чтобы вызвать функцию с помощью HTTP-запроса, сделайте ее публичной.

Скопируйте URL.

Вызовите функцию, добавив к запросу URL из панели.

curl -k -X POST --data '{"args": ["xxxx"], "kwargs": {}}' -H "Content-Type: application/json" URL

Где хххх такой же, как в запросе в начале руководства, а URL взят из настроек функции.

Готово, вы запустили свое первое Serverless-приложение!