161 lines
5.3 KiB
Markdown
161 lines
5.3 KiB
Markdown
# Примеры sless
|
||
|
||
## Что такое sless
|
||
|
||
**sless** — платформа для запуска serverless-функций в Kubernetes-кластере.
|
||
|
||
Ты пишешь код на Python или Node.js, кладёшь в папку, а платформа сама собирает Docker-образ, деплоит и публикует HTTP-эндпоинт. Всё управляется через Terraform.
|
||
|
||
### Ресурсы
|
||
|
||
| Ресурс | Что делает |
|
||
|---|---|
|
||
| `sless_function` | Загружает код, собирает образ и запускает функцию в кластере |
|
||
| `sless_trigger` | Публикует функцию — либо как HTTP-эндпоинт, либо по расписанию (cron) |
|
||
| `sless_job` | Запускает функцию один раз (например, для инициализации БД) и ждёт результата |
|
||
|
||
**Типичный сценарий:** создаёшь `sless_function` с кодом → добавляешь `sless_trigger` с `type = "http"` → получаешь публичный URL вида `https://sless-api.kube5s.ru/fn/default/имя-функции`.
|
||
|
||
---
|
||
|
||
Примеры показывают различные сценарии использования serverless функций через Terraform провайдер `terra.k8c.ru/naeel/sless`.
|
||
|
||
## Требования
|
||
|
||
- Terraform >= 1.0
|
||
- Доступ к `https://sless-api.kube5s.ru`
|
||
|
||
## Провайдер
|
||
|
||
Во всех примерах `main.tf` содержит:
|
||
|
||
```hcl
|
||
provider "sless" {
|
||
endpoint = "https://sless-api.kube5s.ru"
|
||
token = "dev-token-change-me"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Примеры
|
||
|
||
### `simple-python` — джоб передаёт результат в HTTP-функцию (Python)
|
||
|
||
При `apply` запускается джоб, его вывод передаётся в HTTP-функцию через `env_vars`.
|
||
|
||
```bash
|
||
cd simple-python
|
||
terraform init
|
||
terraform apply -auto-approve
|
||
|
||
# Что вернул джоб (время на момент деплоя):
|
||
terraform output job_result
|
||
|
||
# Проверить функцию:
|
||
curl -s https://sless-api.kube5s.ru/fn/default/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/default/simple-node-time-display
|
||
```
|
||
|
||
---
|
||
|
||
### `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/default/hello-http \
|
||
-H 'Content-Type: application/json' -d '{"name":"World"}'
|
||
|
||
# Посмотреть результат джоба:
|
||
terraform output job_message
|
||
```
|
||
|
||
---
|
||
|
||
### `notes-python` — CRUD API на Python + PostgreSQL
|
||
|
||
Полноценное приложение: инициализация схемы БД через джобы, CRUD-функция, read-only функция для списка записей.
|
||
|
||
**Переменные:**
|
||
|
||
| Переменная | Описание | Дефолт |
|
||
|---|---|---|
|
||
| `pg_dsn` | DSN для подключения к PostgreSQL | `postgres://sless:sless-pg-password@postgres.sless.svc.cluster.local:5432/sless?sslmode=disable` |
|
||
|
||
```bash
|
||
cd notes-python
|
||
terraform init
|
||
|
||
# Опционально — переопределить DSN:
|
||
# export TF_VAR_pg_dsn="postgres://user:pass@host:5432/db?sslmode=disable"
|
||
|
||
terraform apply -auto-approve
|
||
|
||
# Проверить инициализацию БД:
|
||
terraform output db_init_table_status
|
||
terraform output db_init_index_status
|
||
|
||
# URL функций:
|
||
terraform output notes_url # CRUD
|
||
terraform output notes_list_url # список всех записей
|
||
|
||
# Создать запись:
|
||
curl -s -X POST "https://sless-api.kube5s.ru/fn/default/notes/add?title=Hello&body=World"
|
||
|
||
# Список записей:
|
||
curl -s https://sless-api.kube5s.ru/fn/default/notes-list
|
||
|
||
# Обновить (id из предыдущего ответа):
|
||
curl -s -X POST "https://sless-api.kube5s.ru/fn/default/notes/update?id=1&title=Updated&body=New+body"
|
||
|
||
# Удалить:
|
||
curl -s -X POST "https://sless-api.kube5s.ru/fn/default/notes/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 — ресурсы (функции, триггеры, джобы)
|
||
├── outputs.tf — URLs и статусы после apply
|
||
├── variables.tf — входные переменные (если есть)
|
||
└── code/ — исходный код функций
|
||
```
|