Pull to refresh

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

Level of difficultyEasy

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.