Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Cloud Functions
  • Сопоставление с другими сервисами Yandex Cloud
    • Все практические руководства
    • Создание навыка Алисы
    • Развертывание веб-приложения
    • Разработка навыка Алисы и сайта с авторизацией
    • Запись данных с устройства в базу данных
    • Запись логов балансировщика в PostgreSQL
    • Разработка Slack-бота
    • Разработка Telegram-бота
    • Подключение к базе данных YDB из функции на Python
    • Подключение к базе данных YDB из функции на Node.js
    • Конвертация видео в GIF на Python
    • Создание функции Node.js с помощью TypeScript
    • Разработка пользовательской интеграции
    • Создание триггера для бюджетов, который вызывает функцию для остановки ВМ
    • Создание интерактивного serverless-приложения с использованием WebSocket
    • Автоматическое копирование объектов из одного бакета Object Storage в другой
    • Запуск вычислений по расписанию в DataSphere
    • Интерактивная отладка функций
    • Регулярное асинхронное распознавание аудиофайлов из Object Storage
    • Канареечный релиз функции Cloud Functions
    • Развертывание отказоустойчивой архитектуры с прерываемыми ВМ
    • Создание триггеров, которые вызывают функции для остановки ВМ и отправки уведомлений в Telegram
    • Загрузка данных из Яндекс Директ в витрину Yandex Managed Service for ClickHouse® с использованием Yandex Cloud Functions, Yandex Object Storage и Yandex Data Transfer
    • Мониторинг состояния географически распределенных устройств
    • Мониторинг показаний датчиков и уведомления о событиях
    • Эмуляция множества IoT-устройств
    • Передача событий Yandex Cloud Postbox в Yandex Data Streams и их анализ с помощью Yandex DataLens
    • Сокращатель ссылок
    • Yandex Tracker: экспорт и визуализация данных
    • Запуск вычислений в DataSphere с помощью API
    • Разработка Telegram-бота для распознавания текста и аудио
    • Настройка реагирования в Yandex Cloud Logging и Cloud Functions
    • Разработка функций в Functions Framework и их развертывание в Yandex Serverless Containers
  • Инструменты
  • Правила тарификации
  • Управление доступом
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Вопросы и ответы
  • Обучающие курсы

В этой статье:

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Скачайте проект
  • Создайте сервисный аккаунт и статический ключ доступа
  • Создайте облачную сеть и подсеть
  • Создайте бюджет
  • Создайте очередь Message Queue
  • Создайте функцию Cloud Functions, которую будет вызывать триггер для бюджетов
  • Создайте триггер для бюджетов
  • Зарегистрируйте Telegram-бота
  • Создайте функцию Cloud Functions, которую будет вызывать триггер для Message Queue
  • Создайте триггер для Message Queue
  • Создайте виртуальные машины Compute Cloud
  • Убедитесь, что по триггеру останавливаются ВМ и отправляются уведомления в Telegram
  • Как удалить созданные ресурсы
  1. Практические руководства
  2. Создание триггеров, которые вызывают функции для остановки ВМ и отправки уведомлений в Telegram

Создание триггеров, которые вызывают функции Cloud Functions для остановки ВМ и отправки уведомлений в Telegram

Статья создана
Yandex Cloud
Улучшена
mmerihsesh
Обновлена 21 апреля 2025 г.
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
    • Скачайте проект
    • Создайте сервисный аккаунт и статический ключ доступа
    • Создайте облачную сеть и подсеть
  • Создайте бюджет
  • Создайте очередь Message Queue
  • Создайте функцию Cloud Functions, которую будет вызывать триггер для бюджетов
  • Создайте триггер для бюджетов
  • Зарегистрируйте Telegram-бота
  • Создайте функцию Cloud Functions, которую будет вызывать триггер для Message Queue
  • Создайте триггер для Message Queue
  • Создайте виртуальные машины Compute Cloud
  • Убедитесь, что по триггеру останавливаются ВМ и отправляются уведомления в Telegram
  • Как удалить созданные ресурсы

В этом руководстве вы создадите serverless-инфраструктуру, которая при превышении пороговых значений бюджета будет останавливать запущенные виртуальные машины и отправлять пользователю уведомления в Telegram.

Триггер для бюджетов будет вызывать функцию Cloud Functions, а функция — останавливать виртуальные машины Compute Cloud и отправлять сообщение в очередь Yandex Message Queue.

Триггер для Message Queue будет передавать поступившие в очередь сообщения во вторую функцию Cloud Functions, которая будет отправлять уведомления в Telegram с помощью специально созданного бота.

Чтобы развернуть проект:

  1. Подготовьте облако к работе.
  2. Создайте бюджет.
  3. Создайте очередь Message Queue.
  4. Создайте функцию Cloud Functions, которую будет вызывать триггер для бюджетов.
  5. Создайте триггер для бюджетов.
  6. Зарегистрируйте Telegram-бота.
  7. Создайте функцию Cloud Functions, которую будет вызывать триггер для Message Queue.
  8. Создайте триггер для Message Queue.
  9. Создайте виртуальные машины Compute Cloud.
  10. Убедитесь, что по триггеру останавливаются ВМ и отправляются уведомления в Telegram.

Создавайте все указанные ресурсы Yandex Cloud в одном каталоге.

Если созданные ресурсы вам больше не нужны, удалите их.

Подготовьте облако к работеПодготовьте облако к работе

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость ресурсов входят:

  • Плата за вычислительные ресурсы ВМ (см. тарифы Compute Cloud).
  • Плата за диски ВМ (см. тарифы Compute Cloud).
  • Плата за использование динамического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud).
  • Плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).
  • Плата за количество запросов к очередям и исходящий трафик (см. тарифы Message Queue).
  • Плата за запись и хранение данных в лог-группе (см. тарифы Yandex Cloud Logging), если вы используете сервис Cloud Logging.

Скачайте проектСкачайте проект

Склонируйте репозиторий c проектом:

git clone https://github.com/yandex-cloud-examples/yc-telegram-bot-with-trigger-for-budget

Создайте сервисный аккаунт и статический ключ доступаСоздайте сервисный аккаунт и статический ключ доступа

  1. Создайте сервисный аккаунт:

    Консоль управления
    CLI
    API
    1. В консоли управления выберите ваш каталог.
    2. В списке сервисов выберите Identity and Access Management.
    3. Нажмите кнопку Создать сервисный аккаунт.
    4. В поле Имя укажите имя service-account-for-budget.
    5. В поле Роли в каталоге нажмите кнопку Добавить роль и выберите роль editor.
    6. Нажмите кнопку Создать.

    Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.

    По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.

    1. Создайте сервисный аккаунт service-account-for-budget:

      yc iam service-account create \
        --name service-account-for-budget
      

      Результат:

      done (1s)
      id: ajed1o6dd581********
      folder_id: b1g9d2k0itu4********
      created_at: "2024-02-23T18:32:38.365175925Z"
      name: service-account-for-budget
      

      Сохраните идентификатор (id) созданного сервисного аккаунта: он пригодится на следующем шаге.

      Подробнее о команде yc iam service-account create читайте в справочнике CLI.

    2. Назначьте сервисному аккаунту роль editor на ваш каталог:

      yc resource-manager folder add-access-binding <имя_каталога> \
        --role editor \
        --subject serviceAccount:<идентификатор_сервисного_аккаунта>
      

      Где:

      • <имя_каталога> — имя вашего каталога в Yandex Cloud.
      • <идентификатор_сервисного_аккаунта> — идентификатор сервисного аккаунта, сохраненный ранее.

      Результат:

      done (2s)
      effective_deltas:
        - action: ADD
          access_binding:
            role_id: editor
            subject:
              id: ajed1o6dd581********
              type: serviceAccount
      

      Подробнее о команде yc resource-manager folder add-access-binding читайте в справочнике CLI.

    Чтобы создать сервисный аккаунт, воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.

    Чтобы назначить сервисному аккаунту роль на каталог, воспользуйтесь методом REST API updateAccessBindings для ресурса Folder или вызовом gRPC API FolderService/UpdateAccessBindings.

  2. Создайте статический ключ доступа:

    Консоль управления
    CLI
    API
    1. В консоли управления выберите ваш каталог.

    2. В списке сервисов выберите Identity and Access Management.

    3. На панели слева выберите Сервисные аккаунты.

    4. В открывшемся списке выберите сервисный аккаунт service-account-for-budget.

    5. На верхней панели нажмите кнопку Создать новый ключ и выберите Создать статический ключ доступа.

    6. При необходимости задайте описание ключа и нажмите кнопку Создать.

    7. Сохраните идентификатор и секретный ключ.

      Внимание

      После закрытия диалога значение ключа будет недоступно.

    Выполните команду:

    yc iam access-key create \
      --service-account-name service-account-for-budget
    

    Результат:

    access_key:
      id: aje75gg0rp8k********
      service_account_id: ajed1o6dd581********
      created_at: "2024-02-23T18:36:41.061060561Z"
      key_id: YCAJEK_r3Z_EvxRAR********
    secret: YCPQhHFMx6rnWXQC9ID425gk3V9YnUc********
    

    Сохраните идентификатор key_id и секретный ключ secret. Получить значение этого ключа снова будет невозможно.

    Подробнее о команде yc iam access-key create читайте в справочнике CLI.

    Чтобы создать ключ доступа, воспользуйтесь методом REST API create для ресурса AccessKey или вызовом gRPC API AccessKeyService/Create.

Создайте облачную сеть и подсетьСоздайте облачную сеть и подсеть

Консоль управления
CLI
API
  1. В консоли управления выберите ваш каталог.
  2. В списке сервисов выберите Virtual Private Cloud.
  3. Справа сверху нажмите кнопку Создать сеть.
  4. В поле Имя укажите my-sample-network.
  5. В поле Дополнительно отключите опцию Создать подсети.
  6. Нажмите кнопку Создать сеть.
  7. На панели слева выберите Подсети.
  8. Справа сверху нажмите кнопку Создать.
  9. В поле Имя укажите sample-subnet-ru-central1-b.
  10. В поле Зона выберите зону доступности ru-central1-b.
  11. В поле Сеть выберите облачную сеть my-sample-network.
  12. В поле CIDR укажите 192.168.1.0/24.
  13. Нажмите кнопку Создать подсеть.
  1. Создайте сеть my-sample-network:

    yc vpc network create my-sample-network
    

    Результат:

    id: enp2gjcvrd59********
    folder_id: b1g9d2k0itu4********
    created_at: "2024-02-23T18:39:17Z"
    name: my-sample-network
    default_security_group_id: enp9uobl2c33********
    

    Подробнее о команде yc vpc network create читайте в справочнике CLI.

  2. Создайте подсеть sample-subnet-ru-central1-b в зоне доступности ru-central1-b:

    yc vpc subnet create sample-subnet-ru-central1-b \
      --zone ru-central1-b \
      --network-name my-sample-network \
      --range 192.168.1.0/24
    

    Результат:

    id: e2l1ejkvq4jv********
    folder_id: b1g9d2k0itu4********
    created_at: "2024-02-23T18:40:26Z"
    name: sample-subnet-ru-ru-central1-b
    network_id: enp2gjcvrd59********
    zone_id: ru-central1-b
    v4_cidr_blocks:
      - 192.168.1.0/24
    

    Подробнее о команде yc vpc subnet create читайте в справочнике CLI.

  1. Чтобы создать сеть, воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create.

  2. Чтобы создать подсеть, воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.

Создайте бюджетСоздайте бюджет

Чтобы создать бюджет, у пользователя должна быть роль editor. Чтобы получать оповещения, достаточно роли viewer.

Интерфейс Yandex Cloud Billing
API
  1. Перейдите в сервис Yandex Cloud Billing.

  2. Выберите платежный аккаунт.

  3. В секции Общие сведения, в поле Идентификатор, скопируйте идентификатор платежного аккаунта. Он пригодится при создании триггера для бюджетов.

  4. Перейдите на вкладку Бюджеты и нажмите кнопку Создать бюджет.

  5. В блоке Общая информация укажите:

    • Имя — vm-budget.

    • Тип — К оплате.

    • Сумма — сумму расходов на потребление, например 10 ₽.

    • Период расчета — Месячный.

    • Дата окончания — дату окончания действия бюджета.

      Дата окончания устанавливает, когда бюджет перестанет считать потребление и отправлять уведомления. Дата окончания — последнее число месяца. Не может быть позже пяти лет от текущей даты.

    • Уведомить — выберите себя.

  6. В блоке Область действия выберите каталог, в котором ведете работу, и сервис Compute Cloud.

  7. В блоке Пороги укажите пороговые значения в процентах, при достижении которых:

    • Указанным пользователям будут приходить уведомления.
    • Будет срабатывать триггер для бюджетов.

    Например, можно указать два порога — 50% и 100%.

  8. Нажмите кнопку Создать.

  9. В открывшемся окне появился новый бюджет vm-budget. В поле Идентификатор скопируйте идентификатор созданного бюджета. Он пригодится позднее при создании триггера.

Чтобы создать бюджет, воспользуйтесь методом create для ресурса Budget или вызовом gRPC API BudgetService/Create.

Создайте очередь Message QueueСоздайте очередь Message Queue

Консоль управления
AWS CLI
  1. В консоли управления выберите ваш каталог.

  2. Выберите сервис Message Queue.

  3. Нажмите кнопку Создать очередь.

  4. В блоке Базовые параметры укажите:

    • Имя — budget-queue.
    • Тип — Стандартная.

    Остальные параметры оставьте без изменений.

  5. Нажмите кнопку Создать.

  6. Нажмите на имя созданной очереди budget-queue и в открывшемся окне скопируйте значения полей:

    • URL — URL очереди.
    • ARN — идентификатор очереди.

    Сохраните эти значения: они пригодятся на следующих шагах.

  1. Установите и настройте AWS CLI. При настройке используйте созданный ранее статический ключ доступа.

  2. Создайте очередь:

    aws sqs create-queue \
      --queue-name budget-queue \
      --endpoint https://message-queue.api.cloud.yandex.net/
    

    Результат:

    {
        "QueueUrl": "https://message-queue.api.cloud.yandex.net/b1glti4eser3********/dj600000001c********/budget-queue"
    }
    

    Сохраните значение URL очереди QueueUrl, оно пригодится на следующих шагах.

  3. Получите идентификатор очереди, указав сохраненный ранее URL в параметре --queue-url:

    aws sqs get-queue-attributes \
      --queue-url <URL_очереди> \
      --attribute-names QueueArn \
      --endpoint https://message-queue.api.cloud.yandex.net/
    

    Результат:

    {
        "Attributes": {
            "QueueArn": "yrn:yc:ymq:ru-central1:b1g9d2k0itu4********:budget-queue"
        }
    }
    

    Сохраните идентификатор очереди QueueArn, он пригодится на следующих шагах.

Создайте функцию Cloud Functions, которую будет вызывать триггер для бюджетовСоздайте функцию Cloud Functions, которую будет вызывать триггер для бюджетов

  1. Подготовьте ZIP-архив с кодом функции.

    Перейдите в директорию yc-telegram-bot-with-trigger-for-budget/steps/4-create-budget-trigger-handler и добавьте файлы в ZIP-архив src_bgt.zip:

    zip src_bgt.zip budget_trigger_handler.go go.mod
    
  2. Создайте функцию:

    Консоль управления
    CLI
    API
    1. В консоли управления выберите ваш каталог.

    2. Выберите сервис Cloud Functions.

    3. Создайте функцию:

      1. Нажмите кнопку Создать функцию.
      2. Введите имя функции budget-trigger-handler.
      3. Нажмите кнопку Создать.
    4. Создайте версию функции:

      1. Выберите среду выполнения golang119, выключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить.

      2. Укажите способ загрузки ZIP-архив и прикрепите архив src_bgt.zip, который создали на предыдущем шаге.

      3. Укажите точку входа budget_trigger_handler.Handler.

      4. В блоке Параметры укажите:

        • Таймаут — 5;
        • Память — 512 МБ;
        • Сервисный аккаунт — service-account-for-budget;
        • Переменные окружения:
          • FOLDER_ID — идентификатор каталога, в котором вы хотите останавливать виртуальные машины.
          • TAG — target-for-stop.
          • AWS_ACCESS_KEY_ID — значение идентификатора статического ключа доступа, сохраненное ранее.
          • AWS_SECRET_ACCESS_KEY — значение секретного ключа статического ключа доступа, сохраненное ранее.
          • BUDGET_QUEUE_URL — значение URL очереди budget-queue, сохраненное ранее.
      5. Нажмите кнопку Сохранить изменения.

    1. Создайте функцию budget-trigger-handler:

      yc serverless function create \
        --name budget-trigger-handler
      

      Результат:

      id: d4e4aigfdm0b********
      folder_id: b1g9d2k0itu4********
      created_at: "2024-02-23T20:15:06.456Z"
      name: budget-trigger-handler
      http_invoke_url: https://functions.yandexcloud.net/d4e4aigfdm0b********
      status: ACTIVE
      

      Подробнее о команде yc serverless function create читайте в справочнике CLI.

    2. Создайте версию функции budget-trigger-handler:

      yc serverless function version create \
        --function-name budget-trigger-handler \
        --memory=512m \
        --execution-timeout=5s \
        --runtime=golang119 \
        --entrypoint=budget_trigger_handler.Handler \
        --service-account-id=<идентификатор_сервисного_аккаунта> \
        --environment FOLDER_ID=<идентификатор_каталога> \
        --environment TAG=target-for-stop \
        --environment AWS_ACCESS_KEY_ID=<идентификатор_статического_ключа> \
        --environment AWS_SECRET_ACCESS_KEY=<значение_секретного_ключа> \
        --environment BUDGET_QUEUE_URL=<URL_очереди> \
        --source-path="./src_bgt.zip"
      

      Где:

      • --service-account-id — идентификатор сервисного аккаунта service-account-for-budget, сохраненный ранее. Сервисный аккаунт будет использоваться для вызова функции.

      • --environment — переменные окружения:

        • FOLDER_ID — идентификатор каталога, в котором вы хотите останавливать виртуальные машины.
        • AWS_ACCESS_KEY_ID — значение идентификатора статического ключа доступа, сохраненное ранее.
        • AWS_SECRET_ACCESS_KEY — значение секретного ключа статического ключа доступа, сохраненное ранее.
        • BUDGET_QUEUE_URL — значение URL очереди budget-queue, сохраненное ранее.
      • --source-path — путь к ZIP-архиву src_bgt.zip.

      Результат:

      done (2m32s)
      id: d4em5gaeev2b********
      function_id: d4e4aigfdm0b********
      created_at: "2024-02-23T20:31:18.458Z"
      runtime: golang119
      entrypoint: budget_trigger_handler.Handler
      resources:
        memory: "536870912"
      execution_timeout: 5s
      service_account_id: ajed1o6dd581********
      image_size: "23977984"
      status: ACTIVE
      tags:
        - $latest
      environment:
        AWS_ACCESS_KEY_ID: YCAJEK_r3Z_EvxRAR********
        AWS_SECRET_ACCESS_KEY: YCPQhHFMx6rnWXQC9ID425gk3V9YnUc0********
        BUDGET_QUEUE_URL: https://message-queue.api.cloud.yandex.net/b1glti4eser3********/dj600000001c********/budget-queue
        FOLDER_ID: b1g9d2k0itu4********
        TAG: target-for-stop
      log_options:
        folder_id: b1g9d2k0itu4********
      

      Подробнее о команде yc serverless function version create читайте в справочнике CLI.

    Чтобы создать функцию, воспользуйтесь методом create для ресурса Function или вызовом gRPC API FunctionService/Create.

    Чтобы создать версию функцию, воспользуйтесь методом createVersion для ресурса Function или вызовом gRPC API FunctionService/CreateVersion.

Создайте триггер для бюджетовСоздайте триггер для бюджетов

Консоль управления
CLI
API
  1. В консоли управления выберите ваш каталог.

  2. Выберите сервис Cloud Functions.

  3. На панели слева выберите Триггеры.

  4. Нажмите кнопку Создать триггер.

  5. В блоке Базовые параметры:

    • В поле Имя укажите имя триггера trigger-for-budget-from-yc.
    • В поле Тип выберите Бюджет.
    • В поле Запускаемый ресурс выберите Функция.
  6. В блоке Настройки бюджета выберите ваш платежный аккаунт и бюджет vm-budget, который создали ранее.

  7. В блоке Настройки функции выберите функцию budget-trigger-handler и укажите сервисный аккаунт service-account-for-budget. От его имени будет вызываться функция.

  8. Нажмите кнопку Создать триггер.

Чтобы создать триггер для бюджетов, который вызывает функцию budget-trigger-handler, выполните команду:

yc serverless trigger create billing-budget \
  --name trigger-for-budget-from-yc \
  --invoke-function-name budget-trigger-handler \
  --invoke-function-service-account-id <идентификатор_сервисного_аккаунта>  \
  --billing-account-id <идентификатор_платежного_аккаунта>  \
  --budget-id <идентификатор_бюджета>

Где:

  • --invoke-function-service-account-id — идентификатор сервисного аккаунта service-account-for-budget, сохраненный ранее. Сервисный аккаунт будет использоваться для вызова функции.
  • --billing-account-id — идентификатор платежного аккаунта, сохраненный ранее при создании бюджета.
  • --budget-id — идентификатор бюджета vm-budget, сохраненный ранее.

Результат:

id: a1sjrukc64hs********
folder_id: b1g9d2k0itu4********
created_at: "2024-02-23T21:20:03.308963151Z"
name: trigger-for-budget-from-yc
rule:
  billing_budget:
    billing_account_id: dn276oa9slgm********
    budget_id: dn2jr6qt0q9k********
    invoke_function:
      function_id: d4e4aigfdm0b********
      function_tag: $latest
      service_account_id: ajed1o6dd581********
status: ACTIVE

Подробнее о команде yc serverless trigger create billing-budget читайте в справочнике CLI.

Чтобы создать триггер для бюджетов, воспользуйтесь методом create для ресурса Trigger или вызовом gRPC API TriggerService/Create.

Зарегистрируйте Telegram-ботаЗарегистрируйте Telegram-бота

  1. Зарегистрируйте бота в Telegram и получите токен:

    1. Для регистрации нового бота запустите в Telegram бота BotFather и отправьте команду:

      /newbot
      

      Результат:

      Alright, a new bot. How are we going to call it? Please choose a name for your bot.
      
    2. В следующем сообщении укажите имя создаваемого бота, например YC VM budget informer. Это имя увидят пользователи при общении с ботом.

      Результат:

      Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.
      
    3. Укажите имя пользователя создаваемого бота, например YCVMBudgetInformerBot. По имени пользователя можно будет найти бота в Telegram. Имя пользователя должно оканчиваться на ...Bot или ..._bot. В результате вы получите токен для HTTP API.

      Результат:

      Done! Congratulations on your new bot. You will find it at t.me/YCVMBudgetInformerBot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.
      
      Use this token to access the HTTP API:
      715063****:AAGuj****-0VrIm7j9i****************
      Keep your token secure and store it safely, it can be used by anyone to control your bot.
      
      For a description of the Bot API, see this page: https://core.telegram.org/bots/api
      
  2. Получите идентификатор ChatID пользователя, которому бот будет направлять уведомления:

    1. Сохраните полученный на предыдущем шаге API-токен в переменную окружения TELEGRAM_BOT_API_TOKEN:

      export TELEGRAM_BOT_API_TOKEN=<Telegram_API-токен>
      
    2. Перейдите в директорию yc-telegram-bot-with-trigger-for-budget/steps/6-register-telegram-bot и выполните команду:

      go run .
      

      При необходимости предварительно установите пакеты Go и telegram_bot.

      Команда запустит Telegram-бота, который на любое сообщение будет возвращать идентификатор ChatID текущего пользователя.

    3. В Telegram найдите созданного вами бота по имени пользователя (например, YCVMBudgetInformerBot) и отправьте ему любое сообщение.

      Результат:

      59529*****
      

      Сохраните полученный идентификатор ChatID. Он пригодится вам позднее.

    4. Вернитесь в терминал и завершите работу бота с помощью сочетания клавиш Ctrl + C.

Создайте функцию Cloud Functions, которую будет вызывать триггер для Message QueueСоздайте функцию Cloud Functions, которую будет вызывать триггер для Message Queue

  1. Подготовьте ZIP-архив с кодом функции.

    Перейдите в директорию yc-telegram-bot-with-trigger-for-budget/steps/7-create-budget-queue-handler и добавьте файлы в ZIP-архив src_queue.zip:

    zip src_queue.zip budget_queue_handler.go utils.go go.mod
    
  2. Создайте функцию:

    Консоль управления
    CLI
    API
    1. В консоли управления выберите ваш каталог.

    2. Выберите сервис Cloud Functions.

    3. Создайте функцию:

      1. Нажмите кнопку Создать функцию.
      2. Введите имя функции budget-queue-handler.
      3. Нажмите кнопку Создать.
    4. Создайте версию функции:

      1. Выберите среду выполнения golang119, выключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить.

      2. Укажите способ загрузки ZIP-архив и прикрепите архив src_queue.zip, который создали на предыдущем шаге.

      3. Укажите точку входа budget_queue_handler.HandleBudgetQueueMessage.

      4. В блоке Параметры укажите:

        • Таймаут — 5;
        • Память — 512 МБ;
        • Сервисный аккаунт — service-account-for-budget;
        • Переменные окружения:
          • TELEGRAM_BOT_API_TOKEN — API-токен Telegram-бота, сохраненный ранее.
          • TELEGRAM_BOT_CHAT_ID — идентификатор ChatID пользователя Telegram, сохраненный ранее.
      5. Нажмите кнопку Сохранить изменения.

    1. Создайте функцию budget-queue-handler:

      yc serverless function create \
        --name budget-queue-handler
      

      Результат:

      id: d4e6r2g9trt5********
      folder_id: b1g9d2k0itu4********
      created_at: "2024-02-24T07:36:04.092Z"
      name: budget-queue-handler
      http_invoke_url: https://functions.yandexcloud.net/d4e6r2g9trt5********
      status: ACTIVE
      
    2. Создайте версию функции budget-queue-handler:

      yc serverless function version create \
        --function-name budget-queue-handler \
        --memory 512m \
        --execution-timeout 5s \
        --runtime golang119 \
        --entrypoint budget_queue_handler.HandleBudgetQueueMessage \
        --service-account-id <идентификатор_сервисного_аккаунта> \
        --environment TELEGRAM_BOT_API_TOKEN=<API-токен_Telegram-бота> \
        --environment TELEGRAM_BOT_CHAT_ID=<ChatID_пользователя_Telegram> \
        --source-path="./src_queue.zip"
      

      Где:

      • --service-account-id — идентификатор сервисного аккаунта service-account-for-budget, сохраненный ранее. Сервисный аккаунт будет использоваться для вызова функции.

      • --environment — переменные окружения:

        • TELEGRAM_BOT_API_TOKEN — API-токен Telegram-бота, сохраненный ранее.
        • TELEGRAM_BOT_CHAT_ID — идентификатор ChatID пользователя Telegram, сохраненный ранее.
      • --source-path — путь к ZIP-архиву src_queue.zip.

      Результат:

      done (29s)
      id: d4e41l4gj7rk********
      function_id: d4e6r2g9trt5********
      created_at: "2024-02-24T07:43:32.464Z"
      runtime: golang119
      entrypoint: budget_queue_handler.HandleBudgetQueueMessage
      resources:
        memory: "536870912"
      execution_timeout: 5s
      service_account_id: ajed1o6dd581********
      image_size: "5464064"
      status: ACTIVE
      tags:
        - $latest
      environment:
        TELEGRAM_BOT_API_TOKEN: 7150638333:AAGujjyua-0VrIm7j9iG3mOxmz1********
        TELEGRAM_BOT_CHAT_ID: "59529*****"
      log_options:
        folder_id: b1g9d2k0itu4********
      

    Чтобы создать функцию, воспользуйтесь методом create для ресурса Function или вызовом gRPC API FunctionService/Create.

    Чтобы создать версию функцию, воспользуйтесь методом createVersion для ресурса Function или вызовом gRPC API FunctionService/CreateVersion.

Создайте триггер для Message QueueСоздайте триггер для Message Queue

Консоль управления
CLI
API
  1. В консоли управления выберите ваш каталог.

  2. Выберите сервис Cloud Functions.

  3. На панели слева выберите Триггеры.

  4. Нажмите кнопку Создать триггер.

  5. В блоке Базовые параметры:

    • В поле Имя укажите имя триггера budget-queue-trigger.
    • В поле Тип выберите Message Queue.
    • В поле Запускаемый ресурс выберите Функция.
  6. В блоке Настройки сообщений Message Queue выберите созданные ранее ресурсы:

    • В поле Очередь сообщений — budget-queue.
    • В поле Сервисный аккаунт — service-account-for-budget.
  7. В блоке Настройки функции выберите функцию budget-queue-handler и укажите сервисный аккаунт service-account-for-budget. От его имени будет вызываться функция.

  8. Нажмите кнопку Создать триггер.

Чтобы создать триггер для Message Queue, который вызывает функцию budget-queue-handler, выполните команду:

yc serverless trigger create message-queue \
  --name budget-queue-trigger \
  --queue <идентификатор_очереди> \
  --queue-service-account-id <идентификатор_сервисного_аккаунта> \
  --invoke-function-name budget-queue-handler \
  --invoke-function-service-account-id <идентификатор_сервисного_аккаунта> \
  --batch-size 1 \
  --batch-cutoff 10s

Где:

  • --queue — идентификатор очереди budget-queue, сохраненный при ее создании.
  • --queue-service-account-id — идентификатор сервисного аккаунта service-account-for-budget, сохраненный ранее. Сервисный аккаунт будет использоваться для чтения сообщений из очереди.
  • --invoke-function-service-account-id — идентификатор сервисного аккаунта service-account-for-budget, сохраненный ранее. Сервисный аккаунт будет использоваться для вызова функции.

Результат:

id: a1sqq6341kvh********
folder_id: b1g9d2k0itu4********
created_at: "2024-02-24T08:35:39.296084612Z"
name: budget-queue-trigger
rule:
  message_queue:
    queue_id: yrn:yc:ymq:ru-central1:b1g9d2k0itu4********:budget-queue
    service_account_id: ajed1o6dd581********
    batch_settings:
      size: "1"
      cutoff: 10s
    invoke_function:
      function_id: d4e6r2g9trt5********
      function_tag: $latest
      service_account_id: ajed1o6dd581********
status: ACTIVE

Подробнее о команде yc serverless trigger create message-queue читайте в справочнике CLI.

Чтобы создать триггер для Message Queue, воспользуйтесь методом create для ресурса Trigger или вызовом gRPC API TriggerService/Create.

Создайте виртуальные машины Compute CloudСоздайте виртуальные машины Compute Cloud

Консоль управления
CLI
API
  1. В консоли управления выберите каталог, в котором будет создана ВМ.

  2. В списке сервисов выберите Compute Cloud.

  3. На панели слева выберите Виртуальные машины.

  4. Нажмите кнопку Создать виртуальную машину.

  5. В блоке Образ загрузочного диска выберите Ubuntu 22.04 LTS.

  6. В блоке Расположение выберите зону доступности ru-central1-b.

  7. В блоке Сетевые настройки:

    • В поле Подсеть выберите созданную ранее подсеть sample-subnet-ru-central1-b.
    • В поле Публичный IP-адрес выберите Автоматически.
  8. В блоке Доступ выберите SSH-ключ и укажите данные для доступа к ВМ:

    • В поле Логин введите имя пользователя, например, yc-user.
    • В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.

      Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:

      • Нажмите кнопку Добавить ключ.
      • Задайте имя SSH-ключа.
      • Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
      • Нажмите кнопку Добавить.

      SSH-ключ будет добавлен в ваш профиль пользователя организации.

      Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.

  9. В блоке Общая информация:

    • Укажите имя ВМ: target-instance-1.
    • В поле Метки нажмите кнопку Добавить метку и введите target-for-stop:true. Нажмите Enter, чтобы сохранить метку.
  10. Нажмите кнопку Создать ВМ.

Создайте виртуальную машину:

yc compute instance create \
  --name target-instance-1 \
  --labels target-for-stop=true \
  --zone ru-central1-b \
  --network-interface subnet-name=sample-subnet-ru-central1-b,nat-ip-version=ipv4 \
  --create-boot-disk image-folder-id=standard-images,image-family=ubuntu-2204-lts \
  --ssh-key ~/.ssh/<имя_ключа>.pub

Где --ssh-key — путь к публичному SSH-ключу. Для этого ключа на виртуальной машине будет автоматически создан пользователь yc-user.

Результат:

done (39s)
id: epdbhj4gssbp********
folder_id: b1g9d2k0itu4********
created_at: "2024-02-24T09:29:16Z"
name: target-instance-1
labels:
  target-for-stop: "true"
zone_id: ru-central1-b
platform_id: standard-v2
resources:
  memory: "2147483648"
  cores: "2"
  core_fraction: "100"
status: RUNNING
metadata_options:
  gce_http_endpoint: ENABLED
  aws_v1_http_endpoint: ENABLED
  gce_http_token: ENABLED
  aws_v1_http_token: DISABLED
boot_disk:
  mode: READ_WRITE
  device_name: epd4uuhf52oe********
  auto_delete: true
  disk_id: epd4uuhf52oe********
network_interfaces:
  - index: "0"
    mac_address: d0:0d:b8:**:**:**
    subnet_id: e2l1ejkvq4jv********
    primary_v4_address:
      address: 192.168.1.9
      one_to_one_nat:
        address: 158.160.**.***
        ip_version: IPV4
serial_port_settings:
  ssh_authorization: INSTANCE_METADATA
gpu_settings: {}
fqdn: epdbhj4gssbp********.auto.internal
scheduling_policy: {}
network_settings:
  type: STANDARD
placement_policy: {}

Подробнее о команде yc compute instance create читайте в справочнике CLI.

Чтобы создать виртуальную машину, воспользуйтесь методом REST API create для ресурса Instance или вызовом gRPC API InstanceService/Create.

Аналогичным способом создайте еще две виртуальные машины — target-instance-2 и target-instance-3. У последней ВМ для метки target-for-stop укажите значение false.

Убедитесь, что по триггеру останавливаются ВМ и отправляются уведомления в TelegramУбедитесь, что по триггеру останавливаются ВМ и отправляются уведомления в Telegram

Дождитесь, когда будут достигнуты пороговые значения, которые вы указали в бюджете. Убедитесь, что при достижении пороговых значений бюджета виртуальные машины target-instance-1 и target-instance-2 остановились, а Telegram-бот отправил вам уведомление о срабатывании триггера для бюджета:

Budget trigger was triggered!

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  1. Удалите триггеры Cloud Functions.
  2. Удалите функции Cloud Functions.
  3. Удалите виртуальные машины.
  4. Удалите очередь Message Queue.
  5. Удалите подсеть, затем удалите облачную сеть.

Была ли статья полезна?

Предыдущая
Развертывание отказоустойчивой архитектуры с прерываемыми ВМ
Следующая
Загрузка данных из Яндекс Директ в витрину Yandex Managed Service for ClickHouse® с использованием Yandex Cloud Functions, Yandex Object Storage и Yandex Data Transfer
Проект Яндекса
© 2025 ООО «Яндекс.Облако»