feat: funcs as global Go service (sless-funcs-service:v0.1.1)

- services/funcs/main.go: standalone Go HTTP server
  extracts JWT sub -> SHA256[:8] -> namespace -> calls operator API
  returns plain text list, sorted active first, /health probe endpoint
- services/funcs/Dockerfile: multi-stage Go build -> alpine
- deployments/k8s/funcs-service.yaml: Deployment+Service+Ingress in sless ns
  ingress path /funcs -> sless-funcs-service:8090, reuses sless-operator-tls
- examples/POSTGRES/resources.tf: removed funcs_list function+trigger+output

Image: naeel/sless-funcs-service:v0.1.1
This commit is contained in:
Naeel
2026-03-18 15:58:08 +03:00
parent 9bc91841c8
commit e8cd62e171
5 changed files with 398 additions and 44 deletions
-44
View File
@@ -161,48 +161,4 @@ output "table_reader_url" {
value = sless_trigger.postgres_table_reader_http.url
}
# Namespace пользователя — извлекаем из уже известного URL триггера.
# URL формат: https://sless.kube5s.ru/fn/sless-{hex16}/{name}
# split("/") → ["https:", "", "sless.kube5s.ru", "fn", "sless-{hex16}", "{name}"]
# element(..., 4) → "sless-{hex16}"
locals {
user_namespace = element(split("/", sless_trigger.postgres_table_reader_http.url), 4)
}
# HTTP-функция возвращает список всех функций пользователя с их статусами и триггерами.
# Вызывает внутренний API оператора — не проходит через внешний Ingress.
# Доступна по URL: https://sless.kube5s.ru/fn/<namespace>/funcs
resource "sless_function" "funcs_list" {
name = "funcs"
runtime = "python3.11"
entrypoint = "funcs_list.list_all"
memory_mb = 128
timeout_sec = 15
env_vars = {
# Внутренний ClusterIP сервис оператора — без TLS, без DNS-overhead
SLESS_API_URL = "http://sless-operator.sless.svc.cluster.local:9090"
SLESS_NAMESPACE = local.user_namespace
SLESS_TOKEN = var.api_token
# Публичный домен: terraform state может хранить старый sless-api.kube5s.ru в URLs
SLESS_EXTERNAL_URL = "https://sless.kube5s.ru"
# Служебные функции — не показывать в листинге
SLESS_EXCLUDE = "funcs,event-writer,event-monitor,event-cleaner"
}
source_dir = "${path.module}/code/funcs-list"
depends_on = [sless_trigger.postgres_table_reader_http]
}
resource "sless_trigger" "funcs_list_http" {
name = "funcs-http"
type = "http"
function = sless_function.funcs_list.name
enabled = true
}
output "funcs_url" {
value = sless_trigger.funcs_list_http.url
}