Сегодня большинство статей про деплой серверлесс-приложений посвящены AWS Lambda. А вот примеров с использованием Yandex Cloud Functions — гораздо меньше. Несмотря на хорошую документацию от самого сервиса, иногда хочется увидеть живой пример на реальном проекте.
У меня стояла задача — автоматизировать деплой Telegram-бота, написанного на Go, в Yandex Cloud Functions через GitLab CI/CD. Рассказываю по шагам, как это можно сделать.
Что потребуется?
Telegram-бот на Go
Аккаунт в Yandex.Cloud
Утилита yc (CLI) или Docker-образ с CLI
GitLab с включенным CI/CD
И немного терпения :)
Шаг 1. Установка CLI Yandex Cloud
Можно установить CLI утилиту yc локально:
Документация: установка CLI
Но я предпочитаю использовать готовый Docker-образ, который будет использоваться и в пайплайне:
docker pull filimonovda/yandexcloud-client
Шаг 2. Авторизация
Для начала нужно получить OAuth-токен: Как получить OAuth-токен
Далее — авторизация в CLI:
yc config set token <ваш_токен>
Теперь можно управлять ресурсами через CLI.
Шаг 3. Создание функции
Создать функцию можно через консоль или CLI. У Yandex Cloud есть отличный гайд по созданию Go-функции: Go Function Quickstart
Я создавал функцию вручную через консоль, чтобы получить function-id, который потом использую в CI/CD.
Шаг 4. Сервисный аккаунт
Хотя можно деплоить под обычной учеткой пользователя, лучше использовать сервисный аккаунт (СА) — это безопаснее и правильнее с точки зрения DevOps-практик.
Шаги:
Создаем сервисный аккаунт по инструкции:
https://yandex.cloud/ru/docs/iam/quickstart-sa#create-saНазначаем ему необходимые роли (functions.editor, iam.serviceAccounts.user и т.д.)
Генерируем авторизационный ключ:
Генерируем ключ:
yc iam key create \
--service-account-name <имя_СА> \
--output key.json \
--folder-id <folder_id>
Шаг 5. Подготовка ключа для CI
Чтобы передать key.json в GitLab CI:
Кодируем в base64:
base64 -w0 key.json > key.base64
Добавить содержимое key.base64 в GitLab как маскируемую переменную CI, например KEY_JSON.
Также создайте переменные BOT_TOKEN, FUNCTION_ID, FOLDER_ID — все они пригодятся в деплое.
Шаг 6. GitLab CI/CD пайплайн
Создаём .gitlab-ci.yml с двумя стадиями — сборка и деплой.
Сборка архива:
build:
stage: build
script:
- zip source.zip index.go go.mod
artifacts:
paths:
- source.zip
expire_in: 1h
⚠️ Убедитесь, что в go.mod не указана версия компилятора — Yandex Cloud сам определяет runtime.
Деплой:
deploy:
stage: deploy
image: "filimonovda/yandexcloud-client:latest"
dependencies:
- build
script:
- yc config profile create sa-profile
- echo $KEY_JSON | base64 -d > key.json
- yc config set service-account-key key.json
- yc config set folder-id $FOLDER_ID
- yc serverless function version create \
--function-id=$FUNCTION_ID \
--runtime golang121 \
--entrypoint index.Handler \
--memory 128m \
--execution-timeout 5s \
--environment BOT_TOKEN=$BOT_TOKEN \
--environment API_URL=https://api.telegram.org \
--source-path ./source.zip
Пояснения к параметрам
--function-id — ID вашей функции (можно посмотреть в консоли)
--runtime — используем golang121 (актуальная версия)
--entrypoint — точка входа в Go-функции (index.Handler)
--source-path — архив, собранный на стадии build
--environment — переменные окружения (например, BOT_TOKEN)
Полный список параметров можно найти в документации: https://yandex.cloud/ru/docs/functions/operations/function/version-manage
Заключение
Таким образом, всего за несколько шагов мы автоматизировали деплой Go-приложения (в нашем случае — Telegram-бота) в Yandex Cloud Functions через GitLab CI/CD. Такой подход позволяет:
Минимизировать ручные действия
Использовать Git как единственный источник правды
Обеспечить безопасное хранение ключей и токенов
Если вы тоже используете Yandex.Cloud для серверлесс-функций — делитесь опытом в комментариях. А если остались вопросы — с радостью отвечу!