Как готовить функции к запуску и управлять ими
Кратко:
- Функции в программировании напоминают контейнеры, но без кода внутри.
- Модель программирования определяет интерфейс между кодом и средой выполнения.
- Обработчики принимают данные и контекст вызова и вызывают необходимые функции и методы.
- Контекст используется для взаимодействия программного кода функции с сервисом Yandex Cloud Functions.
- Сервис позволяет использовать такие среды выполнения, как Python, Node.js или Java.
- Версионирование и теги позволяют сохранять и управлять версиями кода.
- Инструменты работы с функциями разнесены по разным вкладкам боковой панели слева.
Как готовить функции к запуску и управлять ими
Логика работы с функциями напоминает работу с контейнерами. Только что созданная функция — набор данных, который позволяет её распознать по уникальному идентификатору, имени и описанию. Этот набор также содержит тип среды выполнения, переменные окружения и параметры вызова кода. При этом кода, который будет запускаться в только что созданной функции, нет. В этом состоит сходство с контейнерами. Функция — это своеобразный контейнер, внутри которого будет выполняться код.
Как привести код к модели программирования
Хотя каждая среда выполнения предъявляет свои требования к коду, существуют единая модель программирования. Она является общей для всех языков и определяет интерфейс между вашим кодом и средой выполнения. Вот что это означает на практике.
Функция представляет собой логический контейнер с набором параметров. Внутри контейнера вызывают версию пользовательского кода, которая обязательно содержит метод. Его нужно указать в точке входа функции. Обработчик принимает поступающие на вход данные и вызывает необходимые функции и методы в коде. Он должен соответствовать требованиям модели программирования функций и уметь принимать данные и контекст вызова.
Контекст используют для взаимодействия программного кода функции с сервисом Yandex Cloud Functions. Например, с помощью контекста узнают время до завершения выполнения Cloud Functions.

Ещё одно важное понятие модели программирования — среда выполнения, т. е. логическая инфраструктура, которая содержит необходимое окружение для запуска пользовательского кода. Она соответствует выбранному языку программирования. Сервис позволяет использовать такие среды выполнения, как Python, Node.js или Java (с полным списком вы можете ознакомиться в документации).
Все поступающие запросы функция обрабатывает последовательно. Если запросы поступают быстрее, чем одна функция успевает их обрабатывать, сервис запускает дополнительные экземпляры этой функции.
Наконец, чтобы сообщить сервису об ошибке при выполнении функции, обрабатывайте ошибки с помощью исключений.
Версионирование и теги
Даже очень хорошо отлаженный код время от времени нуждается в обновлении. В Cloud Functions реализовано простое управление версиями исходного кода. Любое текущее состояние кода вы можете сохранить как новую версию. Для этого после внесения изменений справа вверху на странице редактора нажмите кнопку Создать версию.

Вы также можете создать новую версию с помощью CLI или через API. Вот шаблон команды для CLI:
yc serverless function version create \
--function-id <идентификатор_функции> \
--runtime <среда_выполнения> \
--entrypoint <точка_входа> \
--memory <объём_выделяемой_памяти,_МБ> \
--execution-timeout <таймаут,_с> \
--source-path <путь_к_ZIP-архиву_c_кодом_функции>
Для каждой версии сохраняется свой уникальный идентификатор.
Есть несколько распространённых сценариев использования версий. Например, сложная микросервисная система может использовать разные версии одной и той же функции в разных сценариях. Скажем, более новая версия функции используется ради новых возможностей, а старая поддерживается для обратной совместимости с другими модулями системы, которые пока не обновлены.
И, конечно, если в новой версии кода оказались ошибки, вы всегда можете оперативно перенастроить триггер на выполнение более старой, проверенной версии исходников функции. Для этого используется механизм тегов, позволяющий вызывать определённую версию функции.
Вот как это работает. Последняя версия функции при создании автоматически получает специальный тег
$latest
, а с предыдущей версии функции этот тег автоматически снимается.Допустим, вы создали новую функцию, внесли изменения и сохранили вторую версию кода, которая получила тег
$latest
. В этом случае у первой версии кода не остаётся никакого тега, и вы не можете обращаться именно к этой версии. Чтобы назначить ей тег, вы можете воспользоваться CLI или публичным API. Шаблон команды для CLI выглядит следующим образом:
yc serverless function version set-tag \
--id <идентификатор_версии> \
--tag <тег>
Чтобы подставить в команду правильный идентификатор версии, со страницы со списком всех функций перейдите на страницу с обзором нужной функции.

В нижней части страницы обзора перечислены все версии функции. Вам нужна самая ранняя, она же самая нижняя в списке.

Скопируйте в буфер идентификатор этой версии и подставьте его в шаблон команды. Затем придумайте «говорящее» имя тега. При выборе имени руководствуйтесь простым принципом: если управление функциями в консоли передали новому сотруднику, он должен суметь сам без труда разобраться, что есть что. Допустим, самую первую версию вы решили так и назвать: first. Тогда окончательная команда для CLI будет выглядеть так:
yc serverless function version set-tag \
--id <идентификатор_версии> \
--tag first
Внимание: имена тегов всегда начинаются со строчной латинской буквы, после которой можно использовать арабские цифры и некоторые спецсимволы, такие как дефис и подчёркивание. Если при именовании тега вы сделаете ошибку, CLI выведет справку в формате регулярного выражения.
После успешного назначения тега CLI выведет информацию о версии:
id: d4e5b6pm6pgspn6qff47
function_id: d4echmm41b3hd8hae1hs
created_at: "2022-08-05T11:58:28.838Z"
runtime: golang117
entrypoint: index.Handler
resources:
memory: "134217728"
execution_timeout: 3s
image_size: "884736"
status: ACTIVE
tags:
- first
log_group_id: ckgkat886nqg8qa541l4
Вы можете проверить успешность назначения тега версии, обновив страницу с информацией о функции:

Поскольку в сложных системах у версий кода может быть разная семантика, вы можете назначить одной и той же версии больше одного тега. Для этого просто добавьте ещё один тег по тому же идентификатору, например вот так:
yc serverless function version set-tag \
--id <идентификатор_первой_версии> \
--tag v_1_0_0
А второй версии кода тоже добавьте ещё один тег с инкрементированной версией:
yc serverless function version set-tag \
--id <идентификатор_второй_версии> \
--tag v_1_0_1
Результат:

Теперь при выборе версии кода вы можете ориентироваться как по номеру релиза, так и по «говорящему» тегу.
Чтобы удалить тег, используйте аргумент
remove-tag
, например:
yc serverless function version remove-tag \
--id <идентификатор_версии> \
--tag first
Работа с функцией в консоли управления
Инструменты работы с функциями разнесены по разным вкладкам боковой панели слева. Давайте коротко пройдёмся по ним.
- Обзор. Здесь находится сводка самой важной информации о функции: идентификатор, статус, имя, описание, ссылка для вызова, список версий и т.д.
- Редактор. Вы можете поменять среду выполнения, внести правки в исходный код, указать переменные окружения, изменить объём памяти, выделяемой для выполнения функции, и т.д.
- Тестирование. Здесь вы выбираете версию кода по тегу, готовый шаблон данных или свой собственный — со структурой запроса в формате JSON — и смотрите ответ, который вам возвращает функция.
- Мониторинг. Вы можете отслеживать такие показатели, как количество запросов, время задержки откликов на запросы и количество ошибок.
- Логи. Здесь вы можете посмотреть подробный журнал о выполнении функции. Он помогает находить ошибки в коде.
- Операции. На этой странице перечислены все операции с функцией, такие как обновление кода, назначение и удаление тегов и т.д.
На следующем уроке мы расскажем об инструментах для автоматизации запуска и отладки функций, а затем — в оставшихся уроках этой темы — займёмся практикой.