22 KiB
Fission Console API — Руководство пользователя
Версия: актуальна для модернизированного Fission с мультитенантностью (ngcloud).
Базовый URL
https://fission.kube5s.ru/console/api
Аутентификация
Где взять токен
Сервер поддерживает два типа токенов — определяет автоматически по форме:
| Форма токена | Тип | Описание |
|---|---|---|
JWT (три части через .) |
Production | JWT из личного кабинета NUBES (Профиль → Токены). Валидируется через Deck API облака |
| Любая строка ≥ 6 символов | Demo | Любой произвольный логин — без внешней проверки. Удобно для разработки и тестирования |
| Строка < 6 символов | — | 401 |
Production (NUBES): JWT-токен берётся в личном кабинете NUBES → Профиль → Токены.
Demo: любая строка ≥ 6 символов — например myuser@example.com или dev-user-1.
Передача токена
Два способа — оба равнозначны:
X-Auth-Token: <токен>
Authorization: Bearer <токен>
POST /auth
Проверка токена и получение информации о своём namespace.
curl -X POST https://fission.kube5s.ru/console/api/auth \
-H "Content-Type: application/json" \
-d '{"token": "myuser@example.com", "env": "test"}'
Параметры:
| Поле | Описание |
|---|---|
token |
Токен (JWT или demo-строка) |
env |
Стенд: prod, dev, test (только для JWT; по умолчанию test) |
Ответ 200:
{
"ok": true,
"env": "test",
"namespace": "fission-a3f9c1b2d4e6f8a1",
"email": "user@example.com"
}
Ошибки:
| Код | Причина |
|---|---|
| 400 | Тело не JSON или token пустой |
| 401 | Токен < 6 символов или JWT не прошёл валидацию в Deck API |
| 405 | GET вместо POST |
Namespace детерминирован:
fission-+ hex(SHA256(sub)[:8]) — одинаковый токен → всегда один namespace.
Namespace и RBAC создаются автоматически при первом обращении.
Мультитенантность ★ КЛЮЧЕВОЕ ОТЛИЧИЕ
- Каждый пользователь работает в изолированном K8s namespace:
fission-<hash(token)> - Все операции (создание, список, вызов, удаление) автоматически ограничены своим namespace
- Указать namespace вручную невозможно
- Функции другого пользователя не видны и не доступны — любая операция над чужим объектом возвращает 404 (не 403, чтобы не раскрывать факт существования)
- Routes изолированы: функции разных пользователей с одинаковым именем получают разные HTTP-маршруты
Квоты (применяются автоматически, значения по умолчанию)
| Ресурс | Лимит |
|---|---|
Функции (count/functions.fission.io) |
20 |
Пакеты (count/packages.fission.io) |
40 |
HTTP Triggers (count/httptriggers.fission.io) |
20 |
| Pods | 30 |
| CPU requests (суммарно) | 1 |
| CPU limits (суммарно) | 12 |
| RAM requests (суммарно) | 2 Gi |
| RAM limits (суммарно) | 6 Gi |
Значения настраиваются env vars (
QUOTA_REQ_CPU,QUOTA_PODS, и т.д.) без пересборки.
Функции
POST /functions — Создать функцию из кода (JSON)
curl -X POST https://fission.kube5s.ru/console/api/functions \
-H "X-Auth-Token: user@domain.com" \
-H "Content-Type: application/json" \
-d '{
"name": "my-fn",
"language": "nodejs",
"code": "module.exports = async function(ctx) { return { status: 200, body: \"hello\" }; }"
}'
Параметры запроса:
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
name |
string | ✓ | Имя функции (см. правила ниже) |
language |
string | ✓ | Среда выполнения: nodejs, python, go, php, ruby |
code |
string | ✓ | Исходный код (строка). Максимум 1 MB |
entrypoint |
string | — | Точка входа (по умолчанию — зависит от языка) |
route |
string | — | HTTP-маршрут (по умолчанию /<ns-suffix>/<name>) |
methods |
[]string | — | HTTP-методы (по умолчанию ["GET"]) |
timeout |
int64 | — | Таймаут функции в секундах |
ttl |
string | — | Время жизни функции: 15m, 1h, 2d и т.д. ★ |
Правила именования (name):
- Только строчные буквы, цифры, дефис
- Не начинается и не заканчивается дефисом
- Максимум 57 символов
Ответ 201:
{
"name": "my-fn",
"package": "my-fn-pkg",
"httptrigger": "my-fn-route",
"route": "/a3f9c1b2d4e6/my-fn",
"expires_at": null
}
expires_at— время удаления функции (RFC3339),nullесли TTL не задан.
Ошибки:
| Код | Причина |
|---|---|
| 400 | Нет name/language/code, невалидное имя, неизвестный язык, код > 1 MB, невалидный TTL |
| 409 | Функция с таким именем уже существует у этого пользователя |
POST /functions — Создать функцию из zip-архива (multipart)
Альтернативный способ: передать архив напрямую при создании функции.
curl -X POST https://fission.kube5s.ru/console/api/functions \
-H "X-Auth-Token: user@domain.com" \
-F "name=my-fn" \
-F "language=python" \
-F "entrypoint=main.handler" \
-F "archive=@my-function.zip"
Параметры формы (multipart/form-data):
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
name |
string | ✓ | Имя функции |
language |
string | ✓* | Язык (python, nodejs, go, php, ruby) — или environment |
environment |
string | ✓* | Явное имя environment (вместо language) |
archive |
file | ✓ | zip-архив с кодом. Максимум 100 KB |
entrypoint |
string | — | Точка входа |
route |
string | — | HTTP-маршрут |
methods |
string | — | HTTP-методы через запятую (GET,POST) |
timeout |
string | — | Таймаут в секундах |
ttl |
string | — | Время жизни: 15m, 1h, 2d и т.д. |
Архив должен быть валидным zip (magic bytes
PK). Максимальный суммарный распакованный размер — 100 KB (защита от zip bomb).
Ответ 201:
{
"name": "my-fn",
"namespace": "fission-a3f9c1b2d4e6f8a1",
"environment": "python-env",
"route": "/a3f9c1b2d4e6/my-fn",
"source_type": "archive"
}
GET /functions — Список функций
curl https://fission.kube5s.ru/console/api/functions \
-H "X-Auth-Token: user@domain.com"
Ответ 200 — массив сырых K8s объектов типа Function. Новый пользователь → [].
Возвращает только функции текущего пользователя.
GET /functions/{name} — Описание функции
curl https://fission.kube5s.ru/console/api/functions/my-fn \
-H "X-Auth-Token: user@domain.com"
Ответ 200:
{
"name": "my-fn",
"namespace": "fission-a3f9c1b2d4e6f8a1",
"environment": "nodejs-env",
"package": "my-fn-pkg",
"entrypoint": "main",
"timeout": 60,
"created_at": "2026-05-01T10:00:00Z",
"updated_at": "2026-05-01T12:00:00Z",
"code": "module.exports = async function(ctx) { ... }",
"source_type": "code",
"archive_filename": "",
"route": "/a3f9c1b2d4e6/my-fn",
"methods": ["GET", "POST"],
"raw": {}
}
code— исходный код (если хранится как literal). Для функций из архива может быть пустым.
source_type—"code"или"archive".
raw— полный K8s объект Function.
Ошибки:
| Код | Причина |
|---|---|
| 404 | Функция не существует или принадлежит другому пользователю |
POST /functions/{name}/invoke — Вызов функции
curl -X POST https://fission.kube5s.ru/console/api/functions/my-fn/invoke \
-H "X-Auth-Token: user@domain.com" \
-H "Content-Type: application/json" \
-d '{}'
Ответ 200:
{
"status": 200,
"latency_ms": 42,
"response_raw": "hello"
}
response_raw— тело ответа функции как строка.
status— HTTP-статус ответа функции.
latency_ms— время выполнения в миллисекундах.
Cold start (первый вызов после создания) может занять 10-60 секунд — Pod создаётся и прогревается. Последующие вызовы быстрые.
Ошибки:
| Код | Причина |
|---|---|
| 404 | Функция не существует или принадлежит другому пользователю |
| 502 | Fission router недоступен или функция завершилась с timeout |
PUT /functions/{name}/code — Обновить код функции ★
Обновляет код существующей функции. Создаётся новый Package, executor подхватывает его при следующем вызове.
curl -X PUT https://fission.kube5s.ru/console/api/functions/my-fn/code \
-H "X-Auth-Token: user@domain.com" \
-H "Content-Type: application/json" \
-d '{
"code": "module.exports = async function(ctx) { return { status: 200, body: \"v2\" }; }"
}'
Параметры:
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
code |
string | ✓ | Новый исходный код |
timeout |
int64 | — | Новый таймаут в секундах |
Ответ 200:
{
"updated": true,
"package": "my-fn-pkg-xxxxxx"
}
Ошибки:
| Код | Причина |
|---|---|
| 400 | code пустой или только пробелы |
| 404 | Функция не существует или принадлежит другому пользователю |
PUT /functions/{name}/archive — Обновить архив функции ★
Обновляет функцию новым zip-архивом (multipart/form-data, поле archive).
curl -X PUT https://fission.kube5s.ru/console/api/functions/my-fn/archive \
-H "X-Auth-Token: user@domain.com" \
-F "archive=@my-function-v2.zip"
Ответ 200:
{
"updated": true,
"package": "my-fn-pkg-xxxxxx"
}
PUT /functions/{name}/timeout — Обновить таймаут функции ★
Обновляет только таймаут (и опционально entrypoint) без замены кода или архива.
curl -X PUT https://fission.kube5s.ru/console/api/functions/my-fn/timeout \
-H "X-Auth-Token: user@domain.com" \
-H "Content-Type: application/json" \
-d '{"timeout": 120}'
Параметры:
| Поле | Тип | Описание |
|---|---|---|
timeout |
int64 | Новый таймаут в секундах |
entrypoint |
string | Новая точка входа (опционально) |
Ответ 200:
{
"updated": true,
"timeout": 120
}
DELETE /functions/{name} — Удалить функцию
curl -X DELETE https://fission.kube5s.ru/console/api/functions/my-fn \
-H "X-Auth-Token: user@domain.com"
Ответ 200:
{
"deleted": true,
"name": "my-fn",
"package": "my-fn-pkg"
}
Удаляются также связанные HTTPTrigger, TimeTrigger и Package.
Архив в S3 удаляется асинхронно.
Если язык больше не используется ни одной функцией — environment Pod'ы убираются автоматически.
Ошибки:
| Код | Причина |
|---|---|
| 404 | Функция не существует или принадлежит другому пользователю |
Повторное удаление той же функции → 404.
Прямой вызов по route — GET|POST /fn/{route}
Вызов функции напрямую по HTTP-маршруту без обёртки invoke. Ответ проксируется как есть — без JSON-обёртки.
curl https://fission.kube5s.ru/fn/a3f9c1b2d4e6/my-fn \
-H "X-Auth-Token: user@domain.com"
Используйте этот endpoint когда нужно получить чистый HTTP-ответ функции, а не JSON-обёртку с
response_raw.
Метод запроса (GET/POST/…) проксируется без изменений.
Time Triggers (расписание)
GET /timetriggers — Список
curl https://fission.kube5s.ru/console/api/timetriggers \
-H "X-Auth-Token: user@domain.com"
Возвращает массив сырых K8s объектов TimeTrigger.
POST /timetriggers — Создать
curl -X POST https://fission.kube5s.ru/console/api/timetriggers \
-H "X-Auth-Token: user@domain.com" \
-H "Content-Type: application/json" \
-d '{
"name": "my-cron",
"functionName": "my-fn",
"cron": "*/5 * * * *"
}'
Параметры:
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
name |
string | ✓ | Имя trigger'а |
functionName |
string | ✓ | Имя функции |
cron |
string | ✓ | Cron-выражение (стандартный формат) |
method |
string | — | HTTP-метод для вызова (по умолчанию POST) |
subpath |
string | — | Дополнительный путь |
Ответ 201:
{
"name": "my-cron",
"namespace": "fission-a3f9c1b2d4e6f8a1",
"cron": "*/5 * * * *",
"method": "POST",
"subpath": "",
"function": "my-fn",
"raw": {}
}
GET /timetriggers/{name} — Описание
Ответ 200 — та же структура что и при создании.
PUT /timetriggers/{name} — Обновить
Ответ 200:
{
"updated": true,
"trigger": { ...та же структура... }
}
DELETE /timetriggers/{name} — Удалить
Ответ 200:
{
"deleted": true,
"name": "my-cron"
}
AI-линтер архивов ★
Проверяет zip-архив на синтаксические ошибки до деплоя. Не создаёт функцию.
Поддерживаемые файлы: .py, .js, .rb, .php.
POST /ai/lint-archive
curl -X POST https://fission.kube5s.ru/console/api/ai/lint-archive \
-H "X-Auth-Token: user@domain.com" \
-F "archive=@my-function.zip" \
-F "entrypoint=main.handler" \
-F "language=python"
Параметры формы:
| Поле | Описание |
|---|---|
archive |
zip-архив (обязательно) |
entrypoint |
Точка входа module.function — проверяется что файл и функция существуют в архиве |
language |
Язык — проверяется что архив содержит файлы нужного расширения |
Ответ 200:
{
"ok": true,
"results": [
{"file": "main.py", "ok": true},
{"file": "helper.py", "ok": false, "output": "SyntaxError: invalid syntax (helper.py, line 5)"},
{"file": "main.handler", "ok": true, "output": "entrypoint 'main.handler' найден"}
]
}
ok: falseв корне объекта означает что хотя бы один файл не прошёл проверку.
outputсодержит вывод линтера — присутствует только при ошибке (для entrypoint — всегда).
Ошибки:
| Код | Причина |
|---|---|
| 400 | Нет поля archive, нет поддерживаемых файлов (.py/.js/.rb/.php) в архиве |
| 413 | Архив > 100 KB или суммарный распакованный размер > 100 KB (zip bomb protection) |
TTL — Время жизни функции ★
Функция может быть создана с ограниченным временем жизни. После истечения TTL функция удаляется автоматически.
Формат: число + суффикс: m (минуты), h (часы), d (дни).
Примеры: 15m, 1h, 2d, 12h
curl -X POST .../functions \
-H "X-Auth-Token: user@domain.com" \
-H "Content-Type: application/json" \
-d '{
"name": "temp-fn",
"language": "python",
"code": "def main(event, context): return \"hi\"",
"ttl": "1h"
}'
В ответе будет поле expires_at (формат RFC3339):
{
"name": "temp-fn",
"package": "temp-fn-pkg",
"httptrigger": "temp-fn-route",
"route": "/...",
"expires_at": "2026-05-06T14:00:00Z"
}
Невалидные значения TTL (0d, -1h, 99z, abc) → 400.
HTTP-коды — сводная таблица
| Код | Значение |
|---|---|
| 200 | Успех (GET, DELETE, PUT) |
| 201 | Объект создан (POST /functions, POST /timetriggers) |
| 400 | Ошибка валидации параметров |
| 401 | Не авторизован (нет токена или < 6 символов) |
| 404 | Объект не найден (или чужой) |
| 405 | Неверный HTTP-метод |
| 409 | Конфликт (дубликат имени) |
| 413 | Тело слишком большое (код > 1 MB, архив > 100 KB) |
| 502 | Ошибка взаимодействия с Fission (router/executor недоступен) |
Формат ошибки:
{ "error": "описание ошибки" }
Поддерживаемые языки
language |
Расширение файла | Entrypoint по умолчанию |
|---|---|---|
python |
.py |
main.main |
nodejs |
.js |
зависит от runtime |
go |
.go |
зависит от runtime |
php |
.php |
зависит от runtime |
ruby |
.rb |
зависит от runtime |
Примеры сценариев
Быстрый старт (inline-код)
BASE="https://fission.kube5s.ru/console/api"
TOKEN="myuser@example.com"
# Создать функцию
curl -X POST "$BASE/functions" \
-H "X-Auth-Token: $TOKEN" -H "Content-Type: application/json" \
-d '{"name":"hello","language":"python","code":"def main(event, context): return \"hello world\""}'
# Вызвать
curl -X POST "$BASE/functions/hello/invoke" \
-H "X-Auth-Token: $TOKEN" -H "Content-Type: application/json" -d '{}'
# Обновить код
curl -X PUT "$BASE/functions/hello/code" \
-H "X-Auth-Token: $TOKEN" -H "Content-Type: application/json" \
-d '{"code":"def main(event, context): return \"v2\""}'
# Удалить
curl -X DELETE "$BASE/functions/hello" -H "X-Auth-Token: $TOKEN"
Создать из архива напрямую
curl -X POST "$BASE/functions" \
-H "X-Auth-Token: $TOKEN" \
-F "name=my-fn" \
-F "language=python" \
-F "entrypoint=main.handler" \
-F "archive=@my-fn.zip"
Проверить архив перед деплоем
curl -X POST "$BASE/ai/lint-archive" \
-H "X-Auth-Token: $TOKEN" \
-F "archive=@my-fn.zip" \
-F "entrypoint=main.handler" \
-F "language=python"
Создать временную функцию (исчезнет через 30 минут)
curl -X POST "$BASE/functions" \
-H "X-Auth-Token: $TOKEN" -H "Content-Type: application/json" \
-d '{"name":"temp-fn","language":"nodejs","code":"module.exports = async () => ({status:200,body:\"tmp\"})","ttl":"30m"}'
Настроить расписание
# Вызывать my-fn каждые 5 минут
curl -X POST "$BASE/timetriggers" \
-H "X-Auth-Token: $TOKEN" -H "Content-Type: application/json" \
-d '{"name":"my-cron","functionName":"my-fn","cron":"*/5 * * * *"}'