195 lines
8.2 KiB
Markdown
195 lines
8.2 KiB
Markdown
# Примеры использования 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`:
|
||
|
||
```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/<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)`.
|
||
|
||
```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/<namespace>/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/<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` |
|
||
|
||
```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/ — исходный код функций
|
||
```
|