- Deleted: TNAR, demo-event-log, demo-managed-functions, hello-go, hello-node, k8s, notes-python, pg-list-python, simple-node, simple-python - POSTGRES: removed luceUNDnode.tf (commented-out legacy), stress_log_1.txt, funcs_list.py; disabled stress_destroy_apply.sh (PG lifecycle stress has delete_user bug); added README.md - examples/README.md: updated to reflect current state (sless_service + sless_job)
101 lines
4.1 KiB
Markdown
101 lines
4.1 KiB
Markdown
# POSTGRES — Пример: Serverless-функции с Managed PostgreSQL
|
||
|
||
Демонстрирует интеграцию sless (serverless functions) с управляемым PostgreSQL (nubes_postgres).
|
||
|
||
## Что делает этот пример
|
||
|
||
1. **Создаёт Managed PostgreSQL** через Terraform (nubes_postgres + nubes_postgres_user + nubes_postgres_database)
|
||
2. **Инициализирует БД**: одноразовый `sless_job` создаёт таблицу `terraform_demo_table`
|
||
3. **Запускает 3 HTTP-сервиса**:
|
||
- `pg-info` (Node.js 20) — версия PostgreSQL-сервера + количество строк в таблице
|
||
- `pg-table-reader` (Python 3.11) — чтение всех строк из таблицы
|
||
- `pg-table-writer` (Python 3.11) — добавление новой строки
|
||
|
||
## Структура файлов
|
||
|
||
```
|
||
POSTGRES/
|
||
├── main.tf # terraform + провайдеры (sless, nubes_cloud)
|
||
├── postgres.tf # Managed PostgreSQL: DB, пользователь, locals с credentials
|
||
├── resources.tf # Namespace и сетевые ресурсы
|
||
├── functions.tf # sless_job (init) + 3 x sless_service
|
||
├── terraform.tfvars # Переменные: realm, s3_uid, token
|
||
├── stress_test.sh # Стресс-тест функций (не трогает PG lifecycle)
|
||
├── stress_destroy_apply.sh.disabled # ОТКЛЮЧЁН — стресс-тест PG lifecycle
|
||
├── code/
|
||
│ ├── sql-runner/ # Python: одноразовое выполнение SQL (CREATE TABLE)
|
||
│ ├── pg-info/ # Node.js: версия PG + строки
|
||
│ ├── table-rw/ # Python: list_rows + add_row
|
||
│ ├── pg-stats/ # Python: расширенная статистика PG
|
||
│ ├── funcs-list/ # Утилита: листинг функций
|
||
│ └── stress-*/ # Функции для стресс-тестирования
|
||
└── scripts/ # Вспомогательные скрипты
|
||
```
|
||
|
||
## Как запустить
|
||
|
||
### Предварительные требования
|
||
|
||
- Terraform >= 1.3
|
||
- Токен sless: `SLESS_TOKEN` (или в `terraform.tfvars`)
|
||
- Токен nubes_cloud: `NUBES_TOKEN`
|
||
- Доступ к realm (например, `ffd1f598c169b0ae`)
|
||
|
||
### Запуск
|
||
|
||
```bash
|
||
# 1. Инициализация
|
||
terraform init
|
||
|
||
# 2. Проверка плана
|
||
terraform plan
|
||
|
||
# 3. Применение (создаст PG + сервисы, запустит init job)
|
||
terraform apply
|
||
```
|
||
|
||
> Первый `apply` может занять 10–15 минут: создание PG-инстанса + kaniko-сборка образов.
|
||
|
||
### Переменные (`terraform.tfvars`)
|
||
|
||
```hcl
|
||
realm = "ffd1f598c169b0ae" # Реалм (namespace в sless)
|
||
s3_uid = "s01234" # S3 bucket для nubes_postgres бэкапов
|
||
sless_token = "..." # Bearer-токен для sless API
|
||
nubes_token = "..." # Bearer-токен для nubes_cloud API
|
||
```
|
||
|
||
### Вывод после apply
|
||
|
||
```
|
||
Outputs:
|
||
table_reader_url = "https://sless.kube5s.ru/v1/namespaces/.../services/pg-table-reader/invoke"
|
||
table_writer_url = "https://sless.kube5s.ru/v1/namespaces/.../services/pg-table-writer/invoke"
|
||
```
|
||
|
||
### Вызов функций
|
||
|
||
```bash
|
||
# Информация о PG (Node.js)
|
||
curl https://.../services/pg-info/invoke
|
||
|
||
# Список строк таблицы (Python)
|
||
curl https://.../services/pg-table-reader/invoke
|
||
|
||
# Добавить строку (Python)
|
||
curl -X POST https://.../services/pg-table-writer/invoke \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"title": "Hello from sless!"}'
|
||
```
|
||
|
||
## Стресс-тест
|
||
|
||
`stress_test.sh` — нагружает функции HTTP-запросами. Запускать после `terraform apply`:
|
||
|
||
```bash
|
||
./stress_test.sh
|
||
```
|
||
|
||
> `stress_destroy_apply.sh.disabled` — ранний тест PG lifecycle (destroy+apply цикл).
|
||
> **Отключён** из-за проблем с удалением postgres_user в определённых сценариях.
|