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

Serverless-функции

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

:::info Тарифный план Создание функций доступно на платных планах. Если функции недоступны, панель предложит обновить план. :::

Рантаймы

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

Обработчик

Контракт совместим с 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).

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

  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}удалить переменную

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) или по статусу функции.