From ba0375d47e40f4f77d93eda61070b0ebf0721440 Mon Sep 17 00:00:00 2001 From: Naeel Date: Wed, 18 Mar 2026 09:23:13 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20POSTGRES=20example=20=E2=80=94=20add=20?= =?UTF-8?q?pg-table-reader=20HTTP=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code/table-reader/requirements.txt | 1 + .../code/table-reader/table_reader.py | 27 ++++++++++++++ examples/POSTGRES/resources.tf | 35 +++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 examples/POSTGRES/code/table-reader/requirements.txt create mode 100644 examples/POSTGRES/code/table-reader/table_reader.py diff --git a/examples/POSTGRES/code/table-reader/requirements.txt b/examples/POSTGRES/code/table-reader/requirements.txt new file mode 100644 index 0000000..58ab769 --- /dev/null +++ b/examples/POSTGRES/code/table-reader/requirements.txt @@ -0,0 +1 @@ +psycopg2-binary==2.9.9 diff --git a/examples/POSTGRES/code/table-reader/table_reader.py b/examples/POSTGRES/code/table-reader/table_reader.py new file mode 100644 index 0000000..ce2935c --- /dev/null +++ b/examples/POSTGRES/code/table-reader/table_reader.py @@ -0,0 +1,27 @@ +# 2026-03-18 +# table_reader.py — HTTP-функция: читает строки из terraform_demo_table и возвращает JSON. +# Подключается к Postgres через env vars (те же что у sql-runner). +import os +import psycopg2 +import psycopg2.extras + + +def list_rows(event): + # Возвращает все строки terraform_demo_table в порядке убывания created_at. + connection = psycopg2.connect( + host=os.environ["PGHOST"], + port=os.environ.get("PGPORT", "5432"), + dbname=os.environ["PGDATABASE"], + user=os.environ["PGUSER"], + password=os.environ["PGPASSWORD"], + sslmode=os.environ.get("PGSSLMODE", "require"), + ) + try: + cursor = connection.cursor(cursor_factory=psycopg2.extras.RealDictCursor) + cursor.execute( + "SELECT id, title, created_at::text FROM terraform_demo_table ORDER BY created_at DESC" + ) + rows = [dict(row) for row in cursor.fetchall()] + return {"rows": rows, "count": len(rows)} + finally: + connection.close() diff --git a/examples/POSTGRES/resources.tf b/examples/POSTGRES/resources.tf index 1a5ceab..d11679a 100644 --- a/examples/POSTGRES/resources.tf +++ b/examples/POSTGRES/resources.tf @@ -95,3 +95,38 @@ resource "sless_job" "postgres_table_init_job" { depends_on = [nubes_postgres_database.db] } +# HTTP-функция читает строки из terraform_demo_table и возвращает JSON. +# Использует те же credentials что и sql-runner. +# Доступна по URL: https://sless.kube5s.ru/fn//pg-table-reader +resource "sless_function" "postgres_table_reader" { + name = "pg-table-reader" + runtime = "python3.11" + entrypoint = "table_reader.list_rows" + memory_mb = 128 + timeout_sec = 30 + + env_vars = { + PGHOST = local.pg_host + PGPORT = "5432" + PGDATABASE = local.pg_database + PGUSER = local.pg_username + PGPASSWORD = local.pg_password + PGSSLMODE = "require" + } + + source_dir = "${path.module}/code/table-reader" + + depends_on = [sless_job.postgres_table_init_job] +} + +resource "sless_trigger" "postgres_table_reader_http" { + name = "pg-table-reader-http" + type = "http" + function = sless_function.postgres_table_reader.name + enabled = true +} + +output "table_reader_url" { + value = sless_trigger.postgres_table_reader_http.url +} +