Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Архитектура и защита базового интернет-сервиса
    • Анализ поресурсной детализации расходов с помощью Object Storage
      • Настройка отказоустойчивой архитектуры в Yandex Cloud
      • Интеграция L7-балансировщика с Cloud CDN и Object Storage
      • Автомасштабирование группы ВМ для обработки сообщений из очереди Message Queue
      • Обновление группы ВМ под нагрузкой
      • Создание триггера для бюджетов, который вызывает функцию для остановки ВМ
      • Развертывание отказоустойчивой архитектуры с прерываемыми ВМ
      • Создание триггеров, которые вызывают функции для остановки ВМ и отправки уведомлений в Telegram

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

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

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

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

Создайте триггер для бюджетов, который вызывает функцию Cloud Functions. Функция будет останавливать виртуальные машины Compute Cloud при превышении пороговых значений, заданных в бюджете.

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

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

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

Перед началом работыПеред началом работы

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

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

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

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

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

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

  • Плата за использование виртуальных машин (см. тарифы Compute Cloud).
  • Плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).

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

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

git clone https://github.com/yandex-cloud-examples/yc-serverless-trigger-budget

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

Консоль управления
CLI
API
  1. В консоли управления перейдите в каталог, в котором хотите создать сервисный аккаунт.
  2. В списке сервисов выберите Identity and Access Management.
  3. Нажмите кнопку Создать сервисный аккаунт.
  4. Введите имя сервисного аккаунта service-account-for-budget.
  5. Нажмите Добавить роль и назначьте сервисному аккаунту роли compute.admin, iam.serviceAccounts.user и functions.functionInvoker.
  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
    

    Результат:

    id: ajersamh4sjq********
    folder_id: b1gc1t4cb638********
    created_at: "2022-12-07T10:36:29.726397755Z"
    name: service-account-for-budget
    
  2. Получите список каталогов в облаке:

    yc resource-manager folder list
    

    Результат:

    +----------------------+----------------------+--------+--------+
    |          ID          |         NAME         | LABELS | STATUS |
    +----------------------+----------------------+--------+--------+
    | b1gp7arme3nn******** | my-folder            |        | ACTIVE |
    | b1g0itj57rbj******** | test-folder          |        | ACTIVE |
    +----------------------+----------------------+--------+--------+
    

    Сохраните идентификатор каталога, в котором хотите создать сервисный аккаунт.

  3. Получите список сервисных аккаунтов в каталоге:

    yc iam service-account list
    

    Результат:

    +----------------------+------------------------------+
    |          ID          |             NAME             |
    +----------------------+------------------------------+
    | aje07l4q4vmo******** | test-sa                      |
    | ajersamh4sjq******** | service-account-for-budget   |
    +----------------------+------------------------------+
    

    Сохраните идентификатор сервисного аккаунта service-account-for-budget.

  4. Назначьте сервисному аккаунту роли compute.admin, iam.serviceAccounts.user и functions.functionInvoker на каталог:

    yc resource-manager folder add-access-binding <идентификатор_каталога> \
       --role compute.admin \
       --subject serviceAccount:<идентификатор_сервисного_аккаунта>
    
    yc resource-manager folder add-access-binding <идентификатор_каталога> \
       --role iam.serviceAccounts.user \
       --subject serviceAccount:<идентификатор_сервисного_аккаунта>
    
    yc resource-manager folder add-access-binding <идентификатор_каталога> \
       --role functions.functionInvoker \
       --subject serviceAccount:<идентификатор_сервисного_аккаунта>
    

    Результат:

    done (1s)
    

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

Чтобы назначить сервисному аккаунта роли compute.admin, iam.serviceAccounts.user и functions.functionInvoker на каталог, воспользуйтесь методом setAccessBindings для ресурса ServiceAccount.

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

Перейдите в директорию yc-serverless-trigger-budget/steps/2-create-function/ и добавьте файлы в ZIP-архив src.zip:

zip src.zip index.go go.mod

Создайте функцию Cloud FunctionsСоздайте функцию Cloud Functions

Консоль управления
CLI
API
  1. В консоли управления перейдите в каталог, в котором создали сервисный аккаунт.
  2. Выберите сервис Cloud Functions.
  3. Создайте функцию:
    1. Нажмите кнопку Создать функцию.
    2. Введите имя функции function-for-budget.
    3. Нажмите кнопку Создать.
  4. Создайте версию функции:
    1. Выберите среду выполнения golang119, выключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить.
    2. Укажите способ загрузки ZIP-архив и выберите архив, который создали на предыдущем шаге.
    3. Укажите точку входа index.StopComputeInstances.
    4. В блоке Параметры укажите:
      • Таймаут — 5;
      • Память — 512 МБ;
      • Сервисный аккаунт — service-account-for-budget;
      • Переменные окружения:
        • FOLDER_ID — идентификатор каталога, в котором вы хотите останавливать виртуальные машины.
        • TAG — target-for-stop.
    5. Нажмите кнопку Сохранить изменения.
  1. Создайте функцию function-for-budget:

    yc serverless function create --name function-for-budget
    

    Результат:

    done (1s)
    id: d4eiqjdbqt7s********
    folder_id: b1gc1t4cb638********
    created_at: "2022-12-07T10:44:13.156Z"
    name: function-for-budget
    log_group_id: ckg6bie2rtgd********
    http_invoke_url: https://functions.yandexcloud.net/d4eiqjdbqt7s********
    status: ACTIVE
    
  2. Создайте версию функции function-for-budget:

    yc serverless function version create \
      --function-name function-for-budget \
      --memory=512m \
      --execution-timeout=5s \
      --runtime=golang119 \
      --entrypoint=index.StopComputeInstances \
      --service-account-id=<идентификатор_сервисного_аккаунта> \
      --environment FOLDER_ID=<идентификатор_каталога> \
      --environment TAG=target-for-stop \
      --source-path=./src.zip
    

    Где:

    • --function-name — имя функции, версия которой создается.
    • --memory — объем RAM.
    • --execution-timeout — максимальное время выполнения функции до достижения таймаута.
    • --runtime — среда выполнения.
    • --entrypoint — точка входа.
    • --service-account-id — идентификатор сервисного аккаунта service-account-for-budget.
    • --environment — переменные окружения. FOLDER_ID — идентификатор каталога, в котором вы хотите останавливать виртуальные машины.
    • --source-path — путь до ZIP-архива src.zip.

    Результат:

    done (2m7s)
    id: d4ev38dddr41********
    function_id: d4eiqjdbqt7s********
    created_at: "2022-12-07T11:14:07.802Z"
    runtime: golang119
    entrypoint: index.StopComputeInstances
    resources:
      memory: "536870912"
    execution_timeout: 5s
    service_account_id: ajersamh4sjq********
    image_size: "19587072"
    status: ACTIVE
    tags:
      - $latest
    log_group_id: ckg6bie2rtgd********
    environment:
      FOLDER_ID: b1gc1t4cb638********
      TAG: target-for-stop
    log_options:
      folder_id: b1gc1t4cb638********
    

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

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

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

Чтобы создать бюджет, у пользователя должна быть роль 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.

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

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

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

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

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

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

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

  7. В блоке Настройки функции выберите функцию function-for-budget и укажите:

    • тег версии функции. По умолчанию указан тег $latest.
    • сервисный аккаунт service-account-for-budget. От его имени будет вызываться функция.
  8. Нажмите кнопку Создать триггер.

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

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

Где:

  • --name — имя триггера.
  • --billing-account-id — идентификатор платежного аккаунта.
  • --budget-id — идентификатор бюджета vm-budget.
  • --invoke-function-id — идентификатор функции function-for-budget.
  • --invoke-function-service-account-id — идентификатор сервисного аккаунта service-account-for-budget.

Результат:

id: a1sfe084v4**********
folder_id: b1g88tflru**********
created_at: "2022-12-04T08:45:31.131391Z"
name: vm-stop-trigger
rule:
  billing-budget:
    billing-account-id: dn2char50j**********
    budget-id: dn2jnshmdlc1********
    invoke_function:
      function_id: d4eofc7n0m03********
      function_tag: $latest
      service_account_id: aje3932acd0c********
status: ACTIVE

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

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

CLI
API
  1. Выберите подсеть:

    yc vpc subnet list
    
  2. Создайте виртуальную машину:

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

    Где:

    • --name — имя виртуальной машины.
    • --labels — метка. Триггер для бюджетов будет останавливать виртуальную машину при достижении пороговых значений, если значение метки target-for-stop равно true.
    • --zone — зона доступности, которая соответствует выбранной подсети.
    • subnet-name — имя выбранной подсети.
    • nat-ip-version — публичный IP.
    • image-family — семейство образов. Эта опция позволит установить последнюю версию операционной системы из указанного семейства.
    • --ssh-key — путь до публичного SSH-ключа. Для этого ключа на виртуальной машине будет автоматически создан пользователь yc-user. Как создать пару SSH-ключей.

    Результат:

    done (34s)
    id: fhm8lon8b9a9********
    folder_id: b1gc1t4cb638********
    created_at: "2022-12-07T11:29:39Z"
    name: target-instance-1
    labels:
      target-for-stop: "true"
    zone_id: ru-central1-d
    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: ENABLED
    boot_disk:
      mode: READ_WRITE
      device_name: fhm459pv68ta********
      auto_delete: true
      disk_id: fhm459pv68ta********
    network_interfaces:
      - index: "0"
        mac_address: d0:0d:8a:e2:e8:5a
        subnet_id: e9b3vsm91fl7********
        primary_v4_address:
          address: 10.128.0.4
          one_to_one_nat:
            address: 158.160.47.82
            ip_version: IPV4
    fqdn: fhm8lon8b9a9********.auto.internal
    scheduling_policy: {}
    network_settings:
      type: STANDARD
    placement_policy: {}
    

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

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

Проверьте, что ВМ останавливаются по триггеруПроверьте, что ВМ останавливаются по триггеру

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

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

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

  1. Удалите триггер для бюджетов.
  2. Удалите функцию.
  3. Удалите виртуальные машины.
  4. Удалите сервисный аккаунт.

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

Предыдущая
Обновление группы ВМ под нагрузкой
Следующая
Развертывание отказоустойчивой архитектуры с прерываемыми ВМ
Проект Яндекса
© 2025 ООО «Яндекс.Облако»