# Примеры использования 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//<имя-функции>`. --- ## Требования - Terraform >= 1.0 - JWT-токен для аутентификации в sless API - Доступ к `https://sless-api.kube5s.ru` ## Конфигурация провайдера Во всех примерах файл `main.tf` содержит блок провайдера. Токен передаётся через переменную, значение которой задаётся в `terraform.tfvars`: ```hcl 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]}`. > **Перед запуском любого примера** откройте файл `terraform.tfvars` в директории примера и впишите свой токен Nubes API: > ```hcl > token = "ваш токен Nubes API" > ``` > Токен выдаётся в личном кабинете Nubes. Файл `terraform.tfvars` добавлен в `.gitignore` — он не попадёт в репозиторий. --- ## Примеры ### `hello-node` — минимальный пример на Node.js Две независимые функции: HTTP-функция, возвращающая приветствие, и одноразовое задание, суммирующее набор чисел. Хорошая отправная точка для знакомства с платформой. ```bash cd hello-node terraform init terraform apply -auto-approve # Вызов HTTP-функции с передачей имени: curl -s -X POST https://sless-api.kube5s.ru/fn//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)`. ```bash 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` | ```bash 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-функцию через переменные окружения и отображается при каждом запросе. ```bash cd simple-python terraform init terraform apply -auto-approve terraform output job_result curl -s https://sless-api.kube5s.ru/fn//simple-py-time-display ``` --- ### `simple-node` — то же самое на Node.js 20 ```bash cd simple-node terraform init terraform apply -auto-approve terraform output job_result curl -s https://sless-api.kube5s.ru/fn//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` | ```bash 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" ``` --- ## Полезные команды ```bash # Посмотреть текущее состояние задеплоенных ресурсов: 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/ — исходный код функций ```