diff --git a/.gitignore b/.gitignore index 138cb80..1cb7dfc 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,8 @@ crash.log # Provider plugins / caches .terraform.d/ +# *.tfvars + # Archives and build artifacts *.zip dist/ diff --git a/pg-list-python/README.md b/pg-list-python/README.md new file mode 100644 index 0000000..7bb45db --- /dev/null +++ b/pg-list-python/README.md @@ -0,0 +1,93 @@ +# pg-list-python + +Python-функция, которая читает из PostgreSQL и возвращает JSON. Таблица с демо-данными создаётся автоматически при первом вызове — никакой инициализации руками. + +## Что тут есть + +``` +code/ + catalog.py — функция list_products(event): SELECT из demo_products + requirements.txt — psycopg2-binary + +function.tf — sless_function + sless_trigger + output +main.tf — конфигурация провайдера +variables.tf — token, pg_dsn +terraform.tfvars — значения переменных (не в git) +``` + +## Запуск + +```bash +terraform init +terraform apply -auto-approve + +curl -s $(terraform output -raw catalog_url) +``` + +Ответ: + +```json +{ + "products": [ + {"id": 1, "name": "Ноутбук", "price": 89999.0}, + {"id": 2, "name": "Мышь", "price": 1299.0}, + {"id": 3, "name": "Клавиатура", "price": 3499.0}, + {"id": 4, "name": "Монитор", "price": 32000.0} + ], + "count": 4 +} +``` + +## Переменные + +| Переменная | Обязательна | Описание | +|---|---|---| +| `token` | ✅ | JWT-токен облака. Задаётся в `terraform.tfvars` | +| `pg_dsn` | — | DSN подключения к PostgreSQL. Дефолт — внутрикластерный адрес | + +`terraform.tfvars` не коммитится в git. Минимальное содержимое: + +```hcl +token = "ваш_jwt_токен" +``` + +## Как работает + +``` +terraform apply + → загружает код в S3 + → kaniko собирает Docker-образ (pip install psycopg2-binary) + → Deployment поднимается в кластере + → Ingress публикует URL + +GET /fn//product-catalog + → рантайм вызывает list_products(event) + → psycopg2 подключается к PostgreSQL + → если таблица demo_products не существует — создаёт и заполняет демо-данными + → возвращает JSON со списком +``` + +Таблица `demo_products` создаётся один раз — при первом GET. Повторные вызовы просто читают данные. + +## Изменение данных + +Функция только читает. Чтобы добавить/изменить записи — подключитесь к PostgreSQL напрямую: + +```sql +INSERT INTO demo_products (name, price) VALUES ('Кабель', 499.00); +UPDATE demo_products SET price = 95000 WHERE name = 'Ноутбук'; +``` + +## Пересборка если изменили код + +```bash +terraform apply -replace=sless_function.product_catalog -auto-approve +``` + +## Удаление + +```bash +terraform destroy -auto-approve +``` + +Таблица `demo_products` в PostgreSQL **не удаляется** — только k8s-ресурсы. diff --git a/pg-list-python/terraform.tfvars b/pg-list-python/terraform.tfvars index 757bc22..afbf293 100644 --- a/pg-list-python/terraform.tfvars +++ b/pg-list-python/terraform.tfvars @@ -1 +1 @@ -token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoLWFwaSIsInN1YiI6IjAxOTllMzI1LTFjZGYtN2NkYS05MzE5LWU1MzAyYTg1ZTI5MSIsImV4cCI6MTc4NjkzMjI2MCwiaWF0IjoxNzcxMzgwMjYwLCJqdGkiOiIzOTQ3ZTgyMy0yNjljLTQ0MTAtYmU0My1iNGVkNTc1Njg0ZTQiLCJhdXRoX3RpbWUiOjAsInR5cCI6IiIsImF6cCI6IiIsInNlc3Npb25fc3RhdGUiOiIiLCJhY3IiOiIiLCJhbGxvd2VkLW9yaWdpbnMiOm51bGwsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6bnVsbH0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpudWxsfX0sInNjb3BlIjoiIiwic2lkIjoiIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJuYW1lIjoiIiwiQ2xpZW50SUQiOiIiLCJncm91cHMiOm51bGwsInByZWZlcnJlZF91c2VybmFtZSI6IiIsImdpdmVuX25hbWUiOiIiLCJmYW1pbHlfbmFtZSI6IiIsImVtYWlsIjoidGF6ZXRAbmFyb2QucnUifQ.hzpIIqNWkKIoYUXDaLY7DLyGKH70rz0ZTqanv19qxF10i3N1t1g_KknA4Qsw1MduTyLzIz7y5SRSr4PSQ1gzR0vB_C0GudSFUhyBNNKkS4ClhRDWW9eN_IIEljbiJMLQi2L07XJ7Y5DQ0sIHRAPLkreCDFMKQ0yTCrKoScCJIDuUqzaTcOaX-hfjaxW8iV0SZMDxl0C5O3tke0btxkaLBaAcWH0V-1yu2r2m29fyU33FqikF0xAcDXiuZphfsrShKQYArZjKAphYCP_Vpmr-1sdjinkn8sPSk1qZny0rka8G6WVZUGaZSOnW8SYNLVUwdqtuQmK-Y18o7U0Suzrsjg" +token = "свой токен"