Как стать автором
Обновить

Деплой Telegram-бота на Go в Yandex Cloud Functions с GitLab CI/CD

Уровень сложностиПростой

Сегодня большинство статей про деплой серверлесс-приложений посвящены 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-практик.

Шаги:

  1. Создаем сервисный аккаунт по инструкции:
    https://yandex.cloud/ru/docs/iam/quickstart-sa#create-sa

  2. Назначаем ему необходимые роли (functions.editor, iam.serviceAccounts.user и т.д.)

  3. Генерируем авторизационный ключ:

Генерируем ключ:

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 для серверлесс-функций — делитесь опытом в комментариях. А если остались вопросы — с радостью отвечу!

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.