7.8 KiB
Примеры использования sless
Обзор платформы
sless — система управления serverless-функциями на базе Kubernetes. Разработчик загружает код функции, платформа собирает из него Docker-образ, разворачивает его в кластере и предоставляет HTTP-эндпоинт для вызова. Всё описывается декларативно через Terraform.
Основные ресурсы провайдера
| Ресурс | Назначение |
|---|---|
sless_function |
Описывает функцию: язык, точку входа, лимиты, переменные окружения. При создании загружает код и запускает его сборку в образ. Сама по себе недоступна снаружи — нужен триггер или задание. |
sless_trigger |
Публикует функцию: тип http создаёт публичный URL, тип cron — запуск по расписанию. |
sless_job |
Запускает функцию однократно и ожидает завершения. Используется для одноразовых операций: инициализация БД, миграции, пакетная обработка. |
Стандартная связка для HTTP API: sless_function + sless_trigger с type = "http" — в результате функция доступна по URL вида https://sless-api.kube5s.ru/fn/<namespace>/<имя-функции>.
Требования
- Terraform >= 1.0
- JWT-токен для аутентификации в sless API
- Доступ к
https://sless-api.kube5s.ru
Конфигурация провайдера
Во всех примерах файл main.tf содержит блок провайдера. Токен передаётся через переменную, значение которой задаётся в terraform.tfvars:
provider "sless" {
endpoint = "https://sless-api.kube5s.ru"
token = var.token
nubes_endpoint = "https://deck-api.ngcloud.ru/api/v1"
}
Namespace функций вычисляется автоматически из JWT-токена: sless-{sha256[:8]}.
Примеры
hello-node — минимальный пример на Node.js
Две независимые функции: HTTP-функция, возвращающая приветствие, и одноразовое задание, суммирующее набор чисел. Хорошая отправная точка для знакомства с платформой.
cd hello-node
terraform init
terraform apply -auto-approve
# Вызов HTTP-функции с передачей имени:
curl -s -X POST https://sless-api.kube5s.ru/fn/<namespace>/hello-http \
-H 'Content-Type: application/json' -d '{"name":"World"}'
# Результат задания:
terraform output job_message
hello-go — минимальный пример на Go 1.23
Аналог hello-node, но на Go. Демонстрирует поддержку Go-рантайма: HTTP-функция и одноразовое задание. Код пользователя оформляется как пакет handler с функцией Handle(event).
cd hello-go
terraform init
terraform apply -auto-approve
terraform output job_message
terraform output trigger_url
pg-list-python — выборка данных из PostgreSQL (Python)
Минимальный пример работы с базой данных: одна HTTP-функция читает список записей из таблицы PostgreSQL и возвращает их в JSON. Таблица с тестовыми данными создаётся автоматически при первом вызове. Нет заданий, нет инициализации — только функция и триггер.
Переменные:
| Переменная | Описание | Значение по умолчанию |
|---|---|---|
pg_dsn |
Строка подключения к PostgreSQL | postgres://sless:sless-pg-password@postgres.sless.svc.cluster.local:5432/sless?sslmode=disable |
cd pg-list-python
terraform init
terraform apply -auto-approve
# URL функции выводится после применения:
terraform output catalog_url
# Запрос к функции:
curl -s $(terraform output -raw catalog_url)
simple-python — одноразовое задание передаёт данные в HTTP-функцию (Python)
При apply выполняется задание, которое фиксирует текущее время. Результат передаётся в HTTP-функцию через переменные окружения и отображается при каждом запросе.
cd simple-python
terraform init
terraform apply -auto-approve
terraform output job_result
curl -s https://sless-api.kube5s.ru/fn/<namespace>/simple-py-time-display
simple-node — то же самое на Node.js 20
cd simple-node
terraform init
terraform apply -auto-approve
terraform output job_result
curl -s https://sless-api.kube5s.ru/fn/<namespace>/simple-node-time-display
notes-python — CRUD API на Python с PostgreSQL
Полноценное приложение: инициализация схемы базы данных через задания, CRUD-функция для работы с записями, отдельная функция для получения списка.
Переменные:
| Переменная | Описание | Значение по умолчанию |
|---|---|---|
pg_dsn |
Строка подключения к PostgreSQL | postgres://sless:sless-pg-password@postgres.sless.svc.cluster.local:5432/sless?sslmode=disable |
cd notes-python
terraform init
terraform apply -auto-approve
# Статус инициализации базы данных:
terraform output db_init_table_status
terraform output db_init_index_status
# Создать запись:
curl -s -X POST "$(terraform output -raw notes_url)/add?title=Hello&body=World"
# Получить список записей:
curl -s $(terraform output -raw notes_list_url)
# Обновить запись (id из предыдущего ответа):
curl -s -X POST "$(terraform output -raw notes_url)/update?id=1&title=Updated&body=New+body"
# Удалить запись:
curl -s -X POST "$(terraform output -raw notes_url)/delete?id=1"
Полезные команды
# Посмотреть текущее состояние задеплоенных ресурсов:
terraform show
# Принудительно пересобрать функцию (например, после изменения кода):
terraform apply -replace=sless_function.<имя> -auto-approve
# Повторно запустить задание: увеличить значение run_id в .tf-файле, затем:
terraform apply -auto-approve
# Удалить все ресурсы примера:
terraform destroy -auto-approve
Структура примера
<пример>/
├── main.tf — конфигурация провайдера
├── *.tf — ресурсы: функции, триггеры, задания
├── variables.tf — входные переменные
├── terraform.tfvars — значения переменных (не коммитится в git)
└── code/ — исходный код функций