feat: пример pg-list-python — список из PostgreSQL без джоба
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
# 2026-03-11
|
||||
# catalog.py — читает список продуктов из PostgreSQL.
|
||||
# Таблица demo_products создаётся автоматически при первом вызове.
|
||||
# Точка входа: list_products(event)
|
||||
|
||||
import json
|
||||
import os
|
||||
import psycopg2
|
||||
|
||||
|
||||
def list_products(event):
|
||||
dsn = os.environ["PG_DSN"]
|
||||
conn = psycopg2.connect(dsn)
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
_ensure_table(cur)
|
||||
conn.commit()
|
||||
|
||||
cur.execute("SELECT id, name, price FROM demo_products ORDER BY id")
|
||||
rows = cur.fetchall()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
products = [{"id": row[0], "name": row[1], "price": row[2]} for row in rows]
|
||||
return {"products": products, "count": len(products)}
|
||||
|
||||
|
||||
def _ensure_table(cur):
|
||||
# Создаём таблицу и наполняем демо-данными — только один раз
|
||||
cur.execute("""
|
||||
CREATE TABLE IF NOT EXISTS demo_products (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
price NUMERIC(10,2) NOT NULL
|
||||
)
|
||||
""")
|
||||
cur.execute("SELECT COUNT(*) FROM demo_products")
|
||||
if cur.fetchone()[0] == 0:
|
||||
cur.executemany(
|
||||
"INSERT INTO demo_products (name, price) VALUES (%s, %s)",
|
||||
[
|
||||
("Ноутбук", 89999.00),
|
||||
("Мышь", 1299.00),
|
||||
("Клавиатура", 3499.00),
|
||||
("Монитор", 32000.00),
|
||||
],
|
||||
)
|
||||
@@ -0,0 +1 @@
|
||||
psycopg2-binary
|
||||
@@ -0,0 +1,29 @@
|
||||
# 2026-03-11
|
||||
# function.tf — HTTP-функция: читает из PostgreSQL и возвращает список записей.
|
||||
# Нет джобов, нет инициализации — только функция + HTTP триггер.
|
||||
|
||||
resource "sless_function" "product_catalog" {
|
||||
name = "product-catalog"
|
||||
runtime = "python3.11"
|
||||
entrypoint = "catalog.list_products"
|
||||
memory_mb = 128
|
||||
timeout_sec = 10
|
||||
|
||||
source_dir = "${path.module}/code"
|
||||
|
||||
# DSN передаётся через env — функция не знает об инфраструктуре
|
||||
env_vars = {
|
||||
PG_DSN = var.pg_dsn
|
||||
}
|
||||
}
|
||||
|
||||
resource "sless_trigger" "product_catalog_http" {
|
||||
name = "product-catalog-http"
|
||||
type = "http"
|
||||
function = sless_function.product_catalog.name
|
||||
enabled = true
|
||||
}
|
||||
|
||||
output "catalog_url" {
|
||||
value = sless_trigger.product_catalog_http.url
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
# 2026-03-11
|
||||
# main.tf — провайдер для pg-list-python примера.
|
||||
|
||||
terraform {
|
||||
required_providers {
|
||||
sless = {
|
||||
source = "terra.k8c.ru/naeel/sless"
|
||||
version = "~> 0.1.14"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "sless" {
|
||||
endpoint = "https://sless-api.kube5s.ru"
|
||||
token = var.token
|
||||
nubes_endpoint = "https://deck-api.ngcloud.ru/api/v1"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
# 2026-03-11
|
||||
# variables.tf
|
||||
|
||||
variable "token" {
|
||||
description = "JWT токен облака"
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
variable "pg_dsn" {
|
||||
description = "DSN подключения к PostgreSQL"
|
||||
type = string
|
||||
default = "postgres://sless:sless-pg-password@postgres.sless.svc.cluster.local:5432/sless?sslmode=disable"
|
||||
}
|
||||
Reference in New Issue
Block a user