feat: provider v0.1.9 — namespace removed from resources, moved to provider block
This commit is contained in:
parent
695f217e13
commit
01402d8494
@ -14,7 +14,6 @@ data "archive_file" "handler_http" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "sless_function" "hello_http" {
|
resource "sless_function" "hello_http" {
|
||||||
namespace = "default"
|
|
||||||
name = "hello-http"
|
name = "hello-http"
|
||||||
runtime = "nodejs20"
|
runtime = "nodejs20"
|
||||||
entrypoint = "handler-http.handle"
|
entrypoint = "handler-http.handle"
|
||||||
@ -28,7 +27,6 @@ resource "sless_function" "hello_http" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "sless_trigger" "hello_http" {
|
resource "sless_trigger" "hello_http" {
|
||||||
namespace = "default"
|
|
||||||
name = "hello-http-trigger"
|
name = "hello-http-trigger"
|
||||||
type = "http"
|
type = "http"
|
||||||
function = sless_function.hello_http.name
|
function = sless_function.hello_http.name
|
||||||
|
|||||||
@ -16,7 +16,6 @@ data "archive_file" "handler_job" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "sless_function" "hello_job" {
|
resource "sless_function" "hello_job" {
|
||||||
namespace = "default"
|
|
||||||
name = "hello-job"
|
name = "hello-job"
|
||||||
runtime = "nodejs20"
|
runtime = "nodejs20"
|
||||||
entrypoint = "handler-job.handle"
|
entrypoint = "handler-job.handle"
|
||||||
@ -31,7 +30,6 @@ resource "sless_function" "hello_job" {
|
|||||||
# Одноразовый запуск. Все поля immutable — изменение любого пересоздаёт джоб.
|
# Одноразовый запуск. Все поля immutable — изменение любого пересоздаёт джоб.
|
||||||
# run_id: 0 = не запускать, 1+ = запустить. Для повторного запуска увеличь run_id (1→2→3...).
|
# run_id: 0 = не запускать, 1+ = запустить. Для повторного запуска увеличь run_id (1→2→3...).
|
||||||
resource "sless_job" "hello_run" {
|
resource "sless_job" "hello_run" {
|
||||||
namespace = "default"
|
|
||||||
name = "hello-run"
|
name = "hello-run"
|
||||||
function = sless_function.hello_job.name
|
function = sless_function.hello_job.name
|
||||||
event_json = jsonencode({ numbers = [100, 200, 300] })
|
event_json = jsonencode({ numbers = [100, 200, 300] })
|
||||||
|
|||||||
@ -8,7 +8,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
sless = {
|
sless = {
|
||||||
source = "terra.k8c.ru/naeel/sless"
|
source = "terra.k8c.ru/naeel/sless"
|
||||||
version = "~> 0.1.7"
|
version = "~> 0.1.9"
|
||||||
}
|
}
|
||||||
archive = {
|
archive = {
|
||||||
source = "hashicorp/archive"
|
source = "hashicorp/archive"
|
||||||
@ -18,7 +18,8 @@ terraform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
provider "sless" {
|
provider "sless" {
|
||||||
endpoint = "https://sless-api.kube5s.ru"
|
endpoint = "https://sless-api.kube5s.ru"
|
||||||
token = "dev-token-change-me"
|
token = "dev-token-change-me"
|
||||||
|
namespace = "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -14,7 +14,6 @@
|
|||||||
# Джоб создания таблицы notes.
|
# Джоб создания таблицы notes.
|
||||||
# CREATE TABLE IF NOT EXISTS — безопасно запускать повторно, таблица не пересоздаётся.
|
# CREATE TABLE IF NOT EXISTS — безопасно запускать повторно, таблица не пересоздаётся.
|
||||||
resource "sless_job" "notes_table_init" {
|
resource "sless_job" "notes_table_init" {
|
||||||
namespace = "default"
|
|
||||||
name = "notes-create-table"
|
name = "notes-create-table"
|
||||||
function = sless_function.sql_runner.name
|
function = sless_function.sql_runner.name
|
||||||
wait_timeout_sec = 120
|
wait_timeout_sec = 120
|
||||||
@ -32,7 +31,6 @@ resource "sless_job" "notes_table_init" {
|
|||||||
resource "sless_job" "notes_index_init" {
|
resource "sless_job" "notes_index_init" {
|
||||||
depends_on = [sless_job.notes_table_init]
|
depends_on = [sless_job.notes_table_init]
|
||||||
|
|
||||||
namespace = "default"
|
|
||||||
name = "notes-create-index"
|
name = "notes-create-index"
|
||||||
function = sless_function.sql_runner.name
|
function = sless_function.sql_runner.name
|
||||||
wait_timeout_sec = 60
|
wait_timeout_sec = 60
|
||||||
|
|||||||
@ -14,7 +14,7 @@ terraform {
|
|||||||
# Провайдер для управления serverless функциями через sless API
|
# Провайдер для управления serverless функциями через sless API
|
||||||
sless = {
|
sless = {
|
||||||
source = "terra.k8c.ru/naeel/sless"
|
source = "terra.k8c.ru/naeel/sless"
|
||||||
version = "~> 0.1.7"
|
version = "~> 0.1.9"
|
||||||
}
|
}
|
||||||
# hashicorp/archive — для упаковки исходников в zip перед загрузкой
|
# hashicorp/archive — для упаковки исходников в zip перед загрузкой
|
||||||
archive = {
|
archive = {
|
||||||
@ -27,6 +27,7 @@ terraform {
|
|||||||
# sless провайдер подключается к API кластера.
|
# sless провайдер подключается к API кластера.
|
||||||
# В продакшне token следует передавать через TF_VAR или secrets.
|
# В продакшне token следует передавать через TF_VAR или secrets.
|
||||||
provider "sless" {
|
provider "sless" {
|
||||||
endpoint = "https://sless-api.kube5s.ru"
|
endpoint = "https://sless-api.kube5s.ru"
|
||||||
token = "dev-token-change-me"
|
token = "dev-token-change-me"
|
||||||
|
namespace = "default"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,6 @@ data "archive_file" "notes_list_zip" {
|
|||||||
# Read-only функция в кластере.
|
# Read-only функция в кластере.
|
||||||
# entrypoint = "notes_list.list_notes" → файл notes_list.py, функция list_notes().
|
# entrypoint = "notes_list.list_notes" → файл notes_list.py, функция list_notes().
|
||||||
resource "sless_function" "notes_list" {
|
resource "sless_function" "notes_list" {
|
||||||
namespace = "default"
|
|
||||||
name = "notes-list"
|
name = "notes-list"
|
||||||
runtime = "python3.11"
|
runtime = "python3.11"
|
||||||
entrypoint = "notes_list.list_notes"
|
entrypoint = "notes_list.list_notes"
|
||||||
@ -36,7 +35,6 @@ resource "sless_function" "notes_list" {
|
|||||||
# HTTP-триггер для read-only функции.
|
# HTTP-триггер для read-only функции.
|
||||||
# Создаёт Ingress, URL доступен в outputs.tf.
|
# Создаёт Ingress, URL доступен в outputs.tf.
|
||||||
resource "sless_trigger" "notes_list_http" {
|
resource "sless_trigger" "notes_list_http" {
|
||||||
namespace = "default"
|
|
||||||
name = "notes-list-http"
|
name = "notes-list-http"
|
||||||
type = "http"
|
type = "http"
|
||||||
function = sless_function.notes_list.name
|
function = sless_function.notes_list.name
|
||||||
|
|||||||
@ -20,7 +20,6 @@ data "archive_file" "notes_crud_zip" {
|
|||||||
# CRUD функция в кластере.
|
# CRUD функция в кластере.
|
||||||
# entrypoint = "notes_crud.crud" → файл notes_crud.py, функция crud().
|
# entrypoint = "notes_crud.crud" → файл notes_crud.py, функция crud().
|
||||||
resource "sless_function" "notes_crud" {
|
resource "sless_function" "notes_crud" {
|
||||||
namespace = "default"
|
|
||||||
name = "notes"
|
name = "notes"
|
||||||
runtime = "python3.11"
|
runtime = "python3.11"
|
||||||
entrypoint = "notes_crud.crud"
|
entrypoint = "notes_crud.crud"
|
||||||
@ -39,7 +38,6 @@ resource "sless_function" "notes_crud" {
|
|||||||
# Создаёт Ingress в кластере, URL доступен в outputs.tf.
|
# Создаёт Ingress в кластере, URL доступен в outputs.tf.
|
||||||
# Базовый URL: https://sless-api.kube5s.ru/fn/default/notes
|
# Базовый URL: https://sless-api.kube5s.ru/fn/default/notes
|
||||||
resource "sless_trigger" "notes_crud_http" {
|
resource "sless_trigger" "notes_crud_http" {
|
||||||
namespace = "default"
|
|
||||||
name = "notes-http"
|
name = "notes-http"
|
||||||
type = "http"
|
type = "http"
|
||||||
function = sless_function.notes_crud.name
|
function = sless_function.notes_crud.name
|
||||||
|
|||||||
@ -17,7 +17,6 @@ data "archive_file" "sql_runner_zip" {
|
|||||||
# entrypoint = "sql_runner.run_sql" → файл sql_runner.py, функция run_sql().
|
# entrypoint = "sql_runner.run_sql" → файл sql_runner.py, функция run_sql().
|
||||||
# memory_mb=128 достаточно — DDL запросы не требуют памяти на вычисления.
|
# memory_mb=128 достаточно — DDL запросы не требуют памяти на вычисления.
|
||||||
resource "sless_function" "sql_runner" {
|
resource "sless_function" "sql_runner" {
|
||||||
namespace = "default"
|
|
||||||
name = "sql-runner"
|
name = "sql-runner"
|
||||||
runtime = "python3.11"
|
runtime = "python3.11"
|
||||||
entrypoint = "sql_runner.run_sql"
|
entrypoint = "sql_runner.run_sql"
|
||||||
|
|||||||
@ -6,7 +6,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
sless = {
|
sless = {
|
||||||
source = "terra.k8c.ru/naeel/sless"
|
source = "terra.k8c.ru/naeel/sless"
|
||||||
version = "~> 0.1.7"
|
version = "~> 0.1.9"
|
||||||
}
|
}
|
||||||
archive = {
|
archive = {
|
||||||
source = "hashicorp/archive"
|
source = "hashicorp/archive"
|
||||||
@ -16,6 +16,7 @@ terraform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
provider "sless" {
|
provider "sless" {
|
||||||
endpoint = "https://sless-api.kube5s.ru"
|
endpoint = "https://sless-api.kube5s.ru"
|
||||||
token = "dev-token-change-me"
|
token = "dev-token-change-me"
|
||||||
|
namespace = "default"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,7 +13,6 @@ data "archive_file" "handler_pg_query" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "sless_function" "pg_query" {
|
resource "sless_function" "pg_query" {
|
||||||
namespace = "default"
|
|
||||||
name = "pg-query"
|
name = "pg-query"
|
||||||
runtime = "python3.11"
|
runtime = "python3.11"
|
||||||
entrypoint = "handler.handle"
|
entrypoint = "handler.handle"
|
||||||
@ -31,7 +30,6 @@ resource "sless_function" "pg_query" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resource "sless_trigger" "pg_query_http" {
|
resource "sless_trigger" "pg_query_http" {
|
||||||
namespace = "default"
|
|
||||||
name = "pg-query-http"
|
name = "pg-query-http"
|
||||||
type = "http"
|
type = "http"
|
||||||
function = sless_function.pg_query.name
|
function = sless_function.pg_query.name
|
||||||
|
|||||||
@ -1,13 +1,26 @@
|
|||||||
# Создано: 2026-03-09
|
# Создано: 2026-03-09
|
||||||
# main.tf — точка входа для примера simple-node.
|
# main.tf — пример: запустить один раз скрипт при деплое и передать его результат в функцию.
|
||||||
# Демонстрирует цепочку: sless_job (one-shot) → sless_function (http).
|
# То же самое что simple-python, но на Node.js 20.
|
||||||
# Аналог simple-python, но на Node.js 20.
|
#
|
||||||
|
# Как это работает:
|
||||||
|
# 1. При «terraform apply» запускается скрипт-джоб (time_getter)
|
||||||
|
# 2. Скрипт возвращает JSON с текущим временем
|
||||||
|
# 3. Terraform подхватывает этот JSON и передаёт в переменную окружения HTTP-функции (time_display)
|
||||||
|
# 4. Функция отдаёт время при каждом запросе
|
||||||
|
#
|
||||||
|
# Зачем такое нужно:
|
||||||
|
# Если данные нужны функции, но считаются один раз при деплое —
|
||||||
|
# напишите логику в джоб, а результат передайте через env_vars.
|
||||||
|
# Например: получить токен, версию схемы БД, время деплоя и т.д.
|
||||||
|
#
|
||||||
|
# namespace задаётся один раз здесь, в блоке provider.
|
||||||
|
# В ресурсах (sless_function, sless_trigger, sless_job) namespace НЕ указывается.
|
||||||
|
|
||||||
terraform {
|
terraform {
|
||||||
required_providers {
|
required_providers {
|
||||||
sless = {
|
sless = {
|
||||||
source = "terra.k8c.ru/naeel/sless"
|
source = "terra.k8c.ru/naeel/sless"
|
||||||
version = "~> 0.1.8"
|
version = "~> 0.1.9"
|
||||||
}
|
}
|
||||||
archive = {
|
archive = {
|
||||||
source = "hashicorp/archive"
|
source = "hashicorp/archive"
|
||||||
@ -17,6 +30,7 @@ terraform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
provider "sless" {
|
provider "sless" {
|
||||||
endpoint = "https://sless-api.kube5s.ru"
|
endpoint = "https://sless-api.kube5s.ru"
|
||||||
token = "dev-token-change-me"
|
token = "dev-token-change-me"
|
||||||
|
namespace = "default"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +1,14 @@
|
|||||||
# Создано: 2026-03-09
|
# Создано: 2026-03-09
|
||||||
# outputs.tf — полезные значения после terraform apply.
|
# outputs.tf — что выводит terraform после apply.
|
||||||
|
|
||||||
|
# Адрес вашей функции — откройте в браузере или вставьте в curl
|
||||||
output "display_url" {
|
output "display_url" {
|
||||||
description = "URL HTTP-триггера функции time_display"
|
description = "URL функции time_display"
|
||||||
value = sless_trigger.display_http.url
|
value = sless_trigger.display_http.url
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Что вернул скрипт-джоб — именно это передано в функцию как JOB_TIME
|
||||||
output "job_result" {
|
output "job_result" {
|
||||||
description = "Stdout джоба (return value функции getTime)"
|
description = "Результат выполнения скрипта time_getter"
|
||||||
value = sless_job.run_getter.message
|
value = sless_job.run_getter.message
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,35 +1,35 @@
|
|||||||
# Создано: 2026-03-09
|
# Создано: 2026-03-09
|
||||||
# time-display.tf — постоянная HTTP-функция, получающая данные от джоба.
|
# time-display.tf — HTTP-функция, доступная по URL после apply.
|
||||||
|
# Получает результат джоба (из time-getter.tf) через переменную окружения JOB_TIME.
|
||||||
|
|
||||||
# Упаковываем код функции в zip
|
# Упаковываем код функции в zip для загрузки
|
||||||
data "archive_file" "time_display_zip" {
|
data "archive_file" "time_display_zip" {
|
||||||
type = "zip"
|
type = "zip"
|
||||||
source_dir = "${path.module}/code/time_display"
|
source_dir = "${path.module}/code/time_display"
|
||||||
output_path = "${path.module}/dist/time_display.zip"
|
output_path = "${path.module}/dist/time_display.zip"
|
||||||
}
|
}
|
||||||
|
|
||||||
# HTTP-функция: постоянный Deployment, читает JOB_TIME из env
|
# HTTP-функция — отвечает на запросы по URL из outputs.tf
|
||||||
resource "sless_function" "time_display" {
|
resource "sless_function" "time_display" {
|
||||||
namespace = "default"
|
name = "simple-node-time-display" # уникальное имя в namespace
|
||||||
name = "simple-node-time-display"
|
|
||||||
runtime = "nodejs20"
|
runtime = "nodejs20"
|
||||||
entrypoint = "time_display.showTime"
|
entrypoint = "time_display.showTime" # файл.функция в code/time_display/
|
||||||
memory_mb = 64
|
memory_mb = 64
|
||||||
|
|
||||||
# Значение вычислено джобом при apply и зафиксировано в state
|
# Передаём результат джоба в функцию через переменную окружения.
|
||||||
|
# В коде функции: process.env.JOB_TIME
|
||||||
env_vars = {
|
env_vars = {
|
||||||
JOB_TIME = sless_job.run_getter.message
|
JOB_TIME = sless_job.run_getter.message
|
||||||
}
|
}
|
||||||
|
|
||||||
code_path = data.archive_file.time_display_zip.output_path
|
code_path = data.archive_file.time_display_zip.output_path
|
||||||
code_hash = filesha256("${path.module}/code/time_display/time_display.js")
|
code_hash = filesha256("${path.module}/code/time_display/time_display.js") # для пересборки при изменении кода
|
||||||
|
|
||||||
depends_on = [sless_job.run_getter]
|
depends_on = [sless_job.run_getter] # ждём завершения джоба перед деплоем функции
|
||||||
}
|
}
|
||||||
|
|
||||||
# HTTP-триггер — публикует функцию по URL
|
# Публикуем функцию по HTTP — URL будет в outputs.tf
|
||||||
resource "sless_trigger" "display_http" {
|
resource "sless_trigger" "display_http" {
|
||||||
namespace = "default"
|
|
||||||
name = "simple-node-display-http"
|
name = "simple-node-display-http"
|
||||||
type = "http"
|
type = "http"
|
||||||
function = sless_function.time_display.name
|
function = sless_function.time_display.name
|
||||||
|
|||||||
@ -1,36 +1,35 @@
|
|||||||
# Создано: 2026-03-09
|
# Создано: 2026-03-09
|
||||||
# time-getter.tf — одноразовая функция + джоб запускающий её при apply.
|
# time-getter.tf — скрипт который запускается ОДИН РАЗ при terraform apply.
|
||||||
# sless_job.run_getter.message после apply содержит stdout runner-а:
|
# После запуска его результат доступен через: sless_job.run_getter.message
|
||||||
# {"time":"2026-03-09T12:34:56.789Z"}
|
# Смотри time-display.tf — там этот результат передаётся в функцию.
|
||||||
# Это значение terraform записывает в env JOB_TIME функции time_display.
|
|
||||||
|
|
||||||
# Упаковываем код функции в zip
|
# Упаковываем код скрипта в zip для загрузки
|
||||||
data "archive_file" "time_getter_zip" {
|
data "archive_file" "time_getter_zip" {
|
||||||
type = "zip"
|
type = "zip"
|
||||||
source_dir = "${path.module}/code/time_getter"
|
source_dir = "${path.module}/code/time_getter"
|
||||||
output_path = "${path.module}/dist/time_getter.zip"
|
output_path = "${path.module}/dist/time_getter.zip"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Функция-вычислитель: запускается только джобом, не имеет HTTP-триггера
|
# Функция для скрипта — без HTTP-триггера, вызывается только через джоб ниже
|
||||||
resource "sless_function" "time_getter" {
|
resource "sless_function" "time_getter" {
|
||||||
namespace = "default"
|
name = "simple-node-time-getter" # уникальное имя в namespace
|
||||||
name = "simple-node-time-getter"
|
|
||||||
runtime = "nodejs20"
|
runtime = "nodejs20"
|
||||||
entrypoint = "time_getter.getTime"
|
entrypoint = "time_getter.getTime" # файл.функция в code/time_getter/
|
||||||
memory_mb = 64
|
memory_mb = 64
|
||||||
|
|
||||||
code_path = data.archive_file.time_getter_zip.output_path
|
code_path = data.archive_file.time_getter_zip.output_path
|
||||||
code_hash = filesha256("${path.module}/code/time_getter/time_getter.js")
|
code_hash = filesha256("${path.module}/code/time_getter/time_getter.js") # для пересборки при изменении кода
|
||||||
}
|
}
|
||||||
|
|
||||||
# Джоб: запускает time_getter один раз при terraform apply.
|
# Джоб — запускает функцию time_getter один раз прямо при apply.
|
||||||
|
# run_id = 1 означает «запустить». Если увеличить (2, 3...) — запустится снова.
|
||||||
|
# После завершения: sless_job.run_getter.message = то что вернула функция
|
||||||
resource "sless_job" "run_getter" {
|
resource "sless_job" "run_getter" {
|
||||||
namespace = "default"
|
|
||||||
name = "simple-node-getter-run"
|
name = "simple-node-getter-run"
|
||||||
function = sless_function.time_getter.name
|
function = sless_function.time_getter.name
|
||||||
run_id = 1
|
run_id = 1
|
||||||
wait_timeout_sec = 120
|
wait_timeout_sec = 120 # сколько секунд ждать завершения скрипта
|
||||||
event_json = "{}"
|
event_json = "{}" # входные данные для скрипта (пусто — данные не нужны)
|
||||||
|
|
||||||
depends_on = [sless_function.time_getter]
|
depends_on = [sless_function.time_getter]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,25 @@
|
|||||||
# Создано: 2026-03-09
|
# Создано: 2026-03-09
|
||||||
# main.tf — точка входа для примера simple-python.
|
# main.tf — пример: запустить один раз скрипт при деплое и передать его результат в функцию.
|
||||||
# Демонстрирует цепочку: sless_job (one-shot) → sless_function (http).
|
#
|
||||||
# Джоб запускается при terraform apply, его stdout (JSON) попадает в
|
# Как это работает:
|
||||||
# sless_job.run_getter.message и передаётся функции через env_vars.
|
# 1. При «terraform apply» запускается скрипт-джоб (time_getter)
|
||||||
|
# 2. Скрипт возвращает JSON с текущим временем
|
||||||
|
# 3. Terraform подхватывает этот JSON и передаёт в переменную окружения HTTP-функции (time_display)
|
||||||
|
# 4. Функция отдаёт время при каждом запросе
|
||||||
|
#
|
||||||
|
# Зачем такое нужно:
|
||||||
|
# Если данные нужны функции, но считаются один раз при деплое —
|
||||||
|
# напишите логику в джоб, а результат передайте через env_vars.
|
||||||
|
# Например: получить токен, версию схемы БД, время деплоя и т.д.
|
||||||
|
#
|
||||||
|
# namespace задаётся один раз здесь, в блоке provider.
|
||||||
|
# В ресурсах (sless_function, sless_trigger, sless_job) namespace НЕ указывается.
|
||||||
|
|
||||||
terraform {
|
terraform {
|
||||||
required_providers {
|
required_providers {
|
||||||
sless = {
|
sless = {
|
||||||
source = "terra.k8c.ru/naeel/sless"
|
source = "terra.k8c.ru/naeel/sless"
|
||||||
version = "~> 0.1.8"
|
version = "~> 0.1.9"
|
||||||
}
|
}
|
||||||
archive = {
|
archive = {
|
||||||
source = "hashicorp/archive"
|
source = "hashicorp/archive"
|
||||||
@ -18,6 +29,7 @@ terraform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
provider "sless" {
|
provider "sless" {
|
||||||
endpoint = "https://sless-api.kube5s.ru"
|
endpoint = "https://sless-api.kube5s.ru"
|
||||||
token = "dev-token-change-me"
|
token = "dev-token-change-me"
|
||||||
|
namespace = "default"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
# Создано: 2026-03-09
|
# Создано: 2026-03-09
|
||||||
# outputs.tf — полезные значения после terraform apply.
|
# outputs.tf — что выводит terraform после apply.
|
||||||
|
|
||||||
# URL HTTP-триггера для тестирования функции display
|
# Адрес вашей функции — откройте в браузере или вставьте в curl
|
||||||
output "display_url" {
|
output "display_url" {
|
||||||
description = "URL HTTP-триггера функции time_display"
|
description = "URL функции time_display"
|
||||||
value = sless_trigger.display_http.url
|
value = sless_trigger.display_http.url
|
||||||
}
|
}
|
||||||
|
|
||||||
# Результат джоба — JSON строка {"time": "..."} из stdout функции get_time()
|
# Что вернул скрипт-джоб — именно это передано в функцию как JOB_TIME
|
||||||
output "job_result" {
|
output "job_result" {
|
||||||
description = "Stdout джоба (return value функции get_time)"
|
description = "Результат выполнения скрипта time_getter"
|
||||||
value = sless_job.run_getter.message
|
value = sless_job.run_getter.message
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,39 +1,35 @@
|
|||||||
# Создано: 2026-03-09
|
# Создано: 2026-03-09
|
||||||
# time-display.tf — постоянная HTTP-функция, получающая данные от джоба.
|
# time-display.tf — HTTP-функция, доступная по URL после apply.
|
||||||
# JOB_TIME берётся из sless_job.run_getter.message (stdout джоба) —
|
# Получает результат джоба (из time-getter.tf) через переменную окружения JOB_TIME.
|
||||||
# это JSON строка {"time": "..."}, terraform передаёт её в env целиком.
|
|
||||||
# Функция парсит её через os.environ, а не через event — демонстрирует
|
|
||||||
# паттерн "данные вычислены один раз при деплое, используются на каждый запрос".
|
|
||||||
|
|
||||||
# Упаковываем код функции в zip
|
# Упаковываем код функции в zip для загрузки
|
||||||
data "archive_file" "time_display_zip" {
|
data "archive_file" "time_display_zip" {
|
||||||
type = "zip"
|
type = "zip"
|
||||||
source_dir = "${path.module}/code/time_display"
|
source_dir = "${path.module}/code/time_display"
|
||||||
output_path = "${path.module}/dist/time_display.zip"
|
output_path = "${path.module}/dist/time_display.zip"
|
||||||
}
|
}
|
||||||
|
|
||||||
# HTTP-функция: постоянный Deployment, читает JOB_TIME из env
|
# HTTP-функция — отвечает на запросы по URL из outputs.tf
|
||||||
resource "sless_function" "time_display" {
|
resource "sless_function" "time_display" {
|
||||||
namespace = "default"
|
name = "simple-py-time-display" # уникальное имя в namespace
|
||||||
name = "simple-py-time-display"
|
|
||||||
runtime = "python3.11"
|
runtime = "python3.11"
|
||||||
entrypoint = "time_display.show_time"
|
entrypoint = "time_display.show_time" # файл.функция в code/time_display/
|
||||||
memory_mb = 64
|
memory_mb = 64
|
||||||
|
|
||||||
# Значение вычислено джобом при apply и зафиксировано в state
|
# Передаём результат джоба в функцию через переменную окружения.
|
||||||
|
# В коде функции: os.environ.get("JOB_TIME")
|
||||||
env_vars = {
|
env_vars = {
|
||||||
JOB_TIME = sless_job.run_getter.message
|
JOB_TIME = sless_job.run_getter.message
|
||||||
}
|
}
|
||||||
|
|
||||||
code_path = data.archive_file.time_display_zip.output_path
|
code_path = data.archive_file.time_display_zip.output_path
|
||||||
code_hash = filesha256("${path.module}/code/time_display/time_display.py")
|
code_hash = filesha256("${path.module}/code/time_display/time_display.py") # для пересборки при изменении кода
|
||||||
|
|
||||||
depends_on = [sless_job.run_getter]
|
depends_on = [sless_job.run_getter] # ждём завершения джоба перед деплоем функции
|
||||||
}
|
}
|
||||||
|
|
||||||
# HTTP-триггер — публикует функцию по URL
|
# Публикуем функцию по HTTP — URL будет в outputs.tf
|
||||||
resource "sless_trigger" "display_http" {
|
resource "sless_trigger" "display_http" {
|
||||||
namespace = "default"
|
|
||||||
name = "simple-py-display-http"
|
name = "simple-py-display-http"
|
||||||
type = "http"
|
type = "http"
|
||||||
function = sless_function.time_display.name
|
function = sless_function.time_display.name
|
||||||
|
|||||||
@ -1,38 +1,35 @@
|
|||||||
# Создано: 2026-03-09
|
# Создано: 2026-03-09
|
||||||
# time-getter.tf — одноразовая функция + джоб запускающий её при apply.
|
# time-getter.tf — скрипт который запускается ОДИН РАЗ при terraform apply.
|
||||||
# sless_job.run_getter.message после apply содержит stdout runner-а:
|
# После запуска его результат доступен через: sless_job.run_getter.message
|
||||||
# {"time": "2026-03-09T12:34:56.789012+00:00"}
|
# Смотри time-display.tf — там этот результат передаётся в функцию.
|
||||||
# Это значение terraform записывает в env JOB_TIME функции time_display.
|
|
||||||
|
|
||||||
# Упаковываем код функции в zip
|
# Упаковываем код скрипта в zip для загрузки
|
||||||
data "archive_file" "time_getter_zip" {
|
data "archive_file" "time_getter_zip" {
|
||||||
type = "zip"
|
type = "zip"
|
||||||
source_dir = "${path.module}/code/time_getter"
|
source_dir = "${path.module}/code/time_getter"
|
||||||
output_path = "${path.module}/dist/time_getter.zip"
|
output_path = "${path.module}/dist/time_getter.zip"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Функция-вычислитель: запускается только джобом, не имеет HTTP-триггера
|
# Функция для скрипта — без HTTP-триггера, вызывается только через джоб ниже
|
||||||
resource "sless_function" "time_getter" {
|
resource "sless_function" "time_getter" {
|
||||||
namespace = "default"
|
name = "simple-py-time-getter" # уникальное имя в namespace
|
||||||
name = "simple-py-time-getter"
|
|
||||||
runtime = "python3.11"
|
runtime = "python3.11"
|
||||||
entrypoint = "time_getter.get_time"
|
entrypoint = "time_getter.get_time" # файл.функция в code/time_getter/
|
||||||
memory_mb = 64
|
memory_mb = 64
|
||||||
|
|
||||||
code_path = data.archive_file.time_getter_zip.output_path
|
code_path = data.archive_file.time_getter_zip.output_path
|
||||||
code_hash = filesha256("${path.module}/code/time_getter/time_getter.py")
|
code_hash = filesha256("${path.module}/code/time_getter/time_getter.py") # для пересборки при изменении кода
|
||||||
}
|
}
|
||||||
|
|
||||||
# Джоб: запускает time_getter один раз при terraform apply.
|
# Джоб — запускает функцию time_getter один раз прямо при apply.
|
||||||
# run_id > 0 — разрешение на запуск (run_id=0 пропускается оператором).
|
# run_id = 1 означает «запустить». Если увеличить (2, 3...) — запустится снова.
|
||||||
# После завершения message = stdout пода = json возвращённый get_time().
|
# После завершения: sless_job.run_getter.message = то что вернула функция
|
||||||
resource "sless_job" "run_getter" {
|
resource "sless_job" "run_getter" {
|
||||||
namespace = "default"
|
|
||||||
name = "simple-py-getter-run"
|
name = "simple-py-getter-run"
|
||||||
function = sless_function.time_getter.name
|
function = sless_function.time_getter.name
|
||||||
run_id = 1
|
run_id = 1
|
||||||
wait_timeout_sec = 120
|
wait_timeout_sec = 120 # сколько секунд ждать завершения скрипта
|
||||||
event_json = "{}"
|
event_json = "{}" # входные данные для скрипта (пусто — данные не нужны)
|
||||||
|
|
||||||
depends_on = [sless_function.time_getter]
|
depends_on = [sless_function.time_getter]
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user