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

Руководство: напишите и разверните функцию

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

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

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

Откройте раздел Функции и нажмите Новая функция. Диалог спросит Название (hello вполне подойдёт), Runtime (среду выполнения), Handler в виде файл.экспорт (оставьте index.handler), Таймаут (мс) и Память (МБ). Пока оставьте значения по умолчанию: их легко изменить потом на вкладке Настройки.

На два параметра стоит взглянуть. Разрешить сетевой доступ по умолчанию выключен: функция, которая только вычисляет, остаётся изолированной, а та, что обращается к внешним 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() }),
  };
};

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

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

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

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

4. Разворачиваем#

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

5. Даём ей URL#

Развёрнутую функцию можно вызывать из SDK, из пайплайна (в том числе по расписанию) или по HTTP через шлюз. Откройте API Gateway, выберите API рабочего пространства по умолчанию и добавьте маршрут: метод POST, путь /hello, цель — функция hello. Выберите режим авторизации: Публичный, чтобы попробовать, API-ключ или 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. Смотрим, как она работает#

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

Путь 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 с типизированным входом. Когда функция вырастает в сервис, который должен работать постоянно, руководство разворачивает его как приложение.