Перейти к основному содержимому

Serverless-функции

Serverless-функции позволяют запускать код без управления серверами — аналог AWS Lambda / Cloudflare Workers. Это отдельная сущность от приложений: свой редактор, свой жизненный цикл, без привязки к Git.

Тарифный план

Функции входят в платные тарифы Apps Platform — через панель, API, CLI и T1000 одинаково. На тарифе «Бесплатный» функции приостанавливаются: вызовы получают ошибку, а код, версии и переменные окружения сохраняются. Оформите тариф — функции запустятся сами в течение нескольких минут. О приостановке владельцу аккаунта приходит письмо. Функции, созданные до 20 сентября 2026 года, продолжают работать на любом тарифе.

Edge Functions у базы Supabase — отдельная история: их включает уровень базы Pro, см. Supabase Studio.

Рантаймы​

Поддерживаются Go, Python, Node.js и Deno. Код пишется прямо в многофайловом редакторе (Monaco) — Git-репозиторий не требуется. Функция может состоять из нескольких файлов, включая файл зависимостей (go.mod, requirements.txt или package.json).

Обработчик​

Для Go, Python и Node.js контракт совместим с AWS Lambda Function URL (payload v2.0): обработчик принимает (event, context) и возвращает ответ со statusCode, headers и body. В event передаются метод, путь, заголовки, query-параметры и тело запроса.

Для этих трёх сред точка входа указывается в формате файл.метод — имя файла без расширения и имя экспортированной функции (например, handler.Handler, main.handler, index.handler).

Go​

Точка входа: handler.Handler

package handler

import (
"context"

"github.com/aws/aws-lambda-go/events"
)

func Handler(ctx context.Context, req events.LambdaFunctionURLRequest) (events.LambdaFunctionURLResponse, error) {
return events.LambdaFunctionURLResponse{
StatusCode: 200,
Headers: map[string]string{"Content-Type": "application/json"},
Body: `{"message": "Hello from Go!"}`,
}, nil
}

Python​

Точка входа: main.handler

def handler(event, context):
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": '{"message": "Hello from Python!"}',
}

Node.js​

Точка входа: index.handler

export const handler = async (event, context) => {
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ message: "Hello from Node.js!" }),
};
};

Бинарные данные​

Поддерживаются бинарные тела запроса и ответа:

  • Запрос — сырые байты доступны как rawBody (Node, Buffer), raw_body (Python, bytes) или body_base64 (Go, base64-строка).
  • Ответ — верните Buffer/bytes либо установите isBase64Encoded (Node) / is_base64_encoded (Python, Go).

Deno​

Точка входа — путь к файлу, например index.ts. Модуль сам запускает HTTP-обработчик через Deno.serve; Lambda-обёртка (event, context) здесь не используется.

Deno.serve(() => new Response(JSON.stringify({message: 'Hello from Deno!'}), {
headers: {'Content-Type': 'application/json'},
}));

Создание и деплой​

  1. Откройте проект → Функции → создать функцию.
  2. Выберите рантайм, отредактируйте файлы и укажите точку входа.
  3. При необходимости задайте переменные окружения и подключите приватную сеть (VPC).
  4. Нажмите «Создать и задеплоить».

Прогресс отображается по шагам (создание → сборка и деплой), статус приходит в реальном времени. После успешного деплоя открывается страница функции.

Вызов​

Каждая функция получает публичный HTTP-эндпоинт и принимает любой HTTP-метод:

POST https://fn.tatnet.cloud/{project_id}/{function_id}

Сборка и версии​

  • При деплое код собирается в изолированной микро-ВМ, артефакт сохраняется в объектном хранилище.
  • Каждый деплой создаёт версию — снимок кода, к которому можно вернуться.
  • Статус сборки приходит в реальном времени через SSE.

Масштабирование до нуля​

Простаивающие функции автоматически останавливаются и поднимаются заново при следующем вызове.

Переменные окружения​

Переменные окружения задаются в панели или через API. Для Node.js доступен встроенный AWS SDK — можно работать с объектным хранилищем без дополнительной установки зависимостей.

Приватная сеть (VPC)​

Функцию можно подключить к VPC аккаунта, чтобы из её кода обращаться к приватным ресурсам (например, к ВМ) по внутренней сети.

API​

Публичный REST API (https://api.min.tatnet.ru/v1, заголовок Authorization: Bearer <tn_live_…>) покрывает полный цикл жизни функции:

МетодПутьДействие
GET/v1/projects/{project_id}/functionsсписок функций проекта
POST/v1/projects/{project_id}/functionsсоздать функцию (name, runtime, files, handler)
GET/v1/projects/{project_id}/functions/{id}получить функцию (включая файлы)
PATCH/v1/projects/{project_id}/functions/{id}обновить код и/или конфигурацию: files, handler, runtime, name, vpc_id — каждое поле опционально
POST/v1/projects/{project_id}/functions/{id}/deployсобрать и задеплоить текущий код
DELETE/v1/projects/{project_id}/functions/{id}удалить функцию
GET/v1/projects/{project_id}/functions/{id}/envсписок переменных окружения (секреты маскируются)
POST/v1/projects/{project_id}/functions/{id}/envсоздать/обновить переменную (name, value, is_secret)
DELETE/v1/projects/{project_id}/functions/{id}/env/{env_var_id}удалить переменную

Адресация без проекта​

У каждого пути выше, кроме создания, есть плоский двойник без проекта в адресе — тот же смысл, та же политика ключа: GET /v1/functions (все функции аккаунта, ?project_id= — только одного проекта) и /v1/functions/{id}/…. Создание остаётся в проекте: POST /v1/projects/{project_id}/functions.

Так же устроены ВМ, тома, кластеры Postgres, Valkey и Kubernetes и балансировщики — /v1/vms, /v1/volumes, /v1/pg-clusters, /v1/valkey-clusters, /v1/kubernetes-clusters, /v1/load-balancers. Подробнее — в разделе про приложения.

files — это карта «путь → содержимое» (как у AWS Lambda): функция может состоять из нескольких файлов, включая go.mod/package.json. Обновление кода — та же пара вызовов, что UpdateFunctionCode + publish у AWS:

# 1. Загрузить новый код (меняется только присланное)
curl -X PATCH "https://api.min.tatnet.ru/v1/projects/{project_id}/functions/{id}" \
-H "Authorization: Bearer $TATNET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"files": {"handler.go": "package handler\n…"}, "handler": "handler.Handler"}'

# 2. Собрать и выкатить
curl -X POST "https://api.min.tatnet.ru/v1/projects/{project_id}/functions/{id}/deploy" \
-H "Authorization: Bearer $TATNET_API_KEY"

Ответ deploy — { "build_id", "function_id", "site_id", "status" }; прогресс сборки виден в панели (SSE) или по статусу функции.