Перейти к содержимому
Документация

Туториал: написать и задеплоить функцию

Функция — самая маленькая единица на платформе: обработчик, который получает событие, делает работу и возвращает результат, а контейнеры, масштабирование, логи и трассы платформа берёт на себя. В этом туториале мы напишем функцию, запустим, задеплоим и дадим ей URL. Входов два, и оба приводят в одну точку: редактор в браузере, когда хочется видеть всё своими глазами, и CLI, когда функция живёт в репозитории.

Путь A: в браузере#

1. Создаём функцию#

Откройте Functions и нажмите + New Function. Диалог спросит Name (hello вполне подойдёт), Runtime, Handler в виде файл.экспорт (оставьте index.handler), Timeout в миллисекундах и Memory в мегабайтах. Пока оставьте значения по умолчанию, их легко поменять потом в Config.

На два переключателя стоит взглянуть. Allow Network Access по умолчанию выключен: функция, которая только считает, остаётся запечатанной, а та, что ходит во внешние API, открывает дверь явно. И если код уже есть, Code ZIP загрузит его целиком вместо набора в редакторе.

2. Пишем обработчик#

Редактор откроется с заготовкой. Замените её обработчиком ниже. Обработчик — это экспортированная async-функция, которая получает event и context и возвращает то, что нужно отдать наружу:

index.jsjs
exports.handler = async (event, context) => {
  // "Run" in the editor passes your JSON as `event`. A gateway route passes an
  // API Gateway-style event whose body is a string. Accept both.
  const input =
    typeof event.body === 'string' ? JSON.parse(event.body || '{}') : (event.body ?? event);
  const name = input.name || 'world';

  console.log(`greeting ${name}`); // ends up in the run's logs and trace

  return {
    statusCode: 200,
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ message: `Hello, ${name}!`, at: new Date().toISOString() }),
  };
};

Небольшой танец в начале стоит понять. Когда вы нажимаете Run в редакторе, введённый JSON приходит как сам event. Когда ту же функцию вызывают через маршрут шлюза, событие имеет форму HTTP-запроса с телом в виде строки. Читая оба варианта, функция ведёт себя одинаково в тестовой панели и в production, а возврат statusCode и body позволяет шлюзу превратить результат в нормальный HTTP-ответ.

3. Запускаем#

Нажмите Run. Тестовая панель принимает JSON-событие: введите {"name": "Ada"} и запустите. Через секунду появится результат, вместе со строками логов, которые напечатала функция, и временем с памятью, которые она потратила. Поменяйте имя, запустите снова. Редактор сохраняет по мере ввода, между попытками ничего не теряется.

Запуск из редактора выполняет текущий код в настоящем контейнере выбранного рантайма. Ошибки показываются как стек-трейс с указанием строки и теми же логами, что вы увидели бы в production.

4. Деплоим#

Нажмите Deploy. Текущий код становится живой версией: он упаковывается, ставятся зависимости, готовятся тёплые контейнеры, поэтому первый настоящий вызов быстрый. Каждый следующий Deploy заменяет живую версию атомарно; вызов, который уже выполняется, завершается на старом коде.

5. Даём ей URL#

Задеплоенную функцию можно вызывать из SDK, из пайплайна (включая запуски по расписанию) или по HTTP через шлюз. Откройте Gateway, возьмите API воркспейса по умолчанию и добавьте маршрут: метод POST, путь /hello, цель — функция hello. Выберите режим авторизации: Public, чтобы попробовать, API key или Bearer для настоящих клиентов. Лимит запросов на маршрут и валидация запроса — опциональны и в одном клике.

Маршрут работает сразу после сохранения. Вызовите его из любого терминала:

terminalbash
# The full URL of every route is shown on the Gateway page. The default
# workspace API lives under /gw/<workspace-slug>/…
curl -X POST "https://api.inquir.org/gw/<workspace-slug>/hello" \
  -H "Content-Type: application/json" \
  -d '{"name":"Ada"}'
# {"message":"Hello, Ada!","at":"2026-09-05T12:00:00.000Z"}

# The same route with API-key auth
curl -X POST "https://api.inquir.org/gw/<workspace-slug>/hello" \
  -H "X-Api-Key: $INQUIR_GATEWAY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Ada"}'

6. Смотрим, как она работает#

Вкладка Traces функции показывает каждый вызов: когда он был, сколько длился, что вернул и логи. Упавшие вызовы помечены и хранят свои стек-трейсы. Страница Executions по всему воркспейсу показывает то же самое для всех функций с фильтрами по статусу и времени — с неё обычно и начинают, когда что-то не так.

Путь B: из терминала#

Когда функции живут в репозитории, CLI создаёт проект, запускает обработчики локально и деплоит их из той же папки, так что код-ревью и CI, которые у вас уже есть, распространяются и на функции:

terminalbash
npm install -g @inquir/compute-cli@latest
inquir init                                    # inquir.config.json, folders, a sample `hello` function
inquir run hello --payload '{"name":"World"}'  # runs locally — no account needed yet
inquir login                                   # browser pairing → a personal access token
inquir use <workspace-slug>                    # the workspace to deploy into
inquir deploy hello                            # package, upload, deploy — streams the build log
inquir invoke hello --payload '{"name":"World"}'
inquir logs hello                              # recent remote invocations
inquir sync status                             # local vs deployed: in-sync / drift / missing

inquir init создаёт inquir.config.json, структуру папок и пример функции hello, написанный через defineFunction из SDK: схема входа объявлена в zod, невалидные payload отбрасываются до вызова обработчика, а тип входа выводится прямо в редакторе. inquir run выполняет функцию локально с переданным payload, аккаунт не нужен, и цикл «поправил — запустил» становится мгновенным.

inquir deploy hello упаковывает функцию, загружает и стримит лог сборки, пока версия не станет живой; inquir invoke вызывает задеплоенную версию, inquir logs показывает её недавние вызовы. В любой момент inquir sync status покажет, какие локальные функции совпадают с задеплоенными, какие разошлись, а какие есть только с одной стороны.

Куда дальше#

Справочник по функциям полностью описывает контракт обработчика, переменные окружения и лимиты; страница шлюза — режимы авторизации, валидацию и подписи вебхуков; страница SDK показывает defineFunction с типизированным входом. Когда функция вырастает в сервис, который должен быть всегда поднят, предыдущий туториал деплоит его как приложение.