Создание триггера для бюджетов, который вызывает функцию Cloud Functions для остановки ВМ
Создайте триггер для бюджетов, который вызывает функцию Cloud Functions. Функция будет останавливать виртуальные машины Compute Cloud при превышении пороговых значений, заданных в бюджете.
Чтобы развернуть проект:
- Скачайте проект.
- Создайте сервисный аккаунт.
- Подготовьте ZIP-архив с кодом функции.
- Создайте функцию Cloud Functions.
- Создайте бюджет.
- Создайте триггер для бюджетов.
- Создайте виртуальные машины Compute Cloud.
- Проверьте, что ВМ останавливаются по триггеру.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость ресурсов входят:
- Плата за использование виртуальных машин (см. тарифы Compute Cloud ).
- Плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).
Скачайте проект
Склонируйте репозиторий c проектом:
git clone https://github.com/yandex-cloud-examples/yc-serverless-trigger-budget
Создайте сервисный аккаунт
- В консоли управления
перейдите в каталог, в котором хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта
service-account-for-budget
. - Нажмите Добавить роль и назначьте сервисному аккаунту роли
compute.admin
,iam.serviceAccounts.user
иfunctions.functionInvoker
. - Нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте сервисный аккаунт
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
-
Получите список каталогов в облаке:
yc resource-manager folder list
Результат:
+----------------------+----------------------+--------+--------+ | ID | NAME | LABELS | STATUS | +----------------------+----------------------+--------+--------+ | b1gp7arme3nn******** | my-folder | | ACTIVE | | b1g0itj57rbj******** | test-folder | | ACTIVE | +----------------------+----------------------+--------+--------+
Сохраните идентификатор каталога, в котором хотите создать сервисный аккаунт.
-
Получите список сервисных аккаунтов в каталоге:
yc iam service-account list
Результат:
+----------------------+------------------------------+ | ID | NAME | +----------------------+------------------------------+ | aje07l4q4vmo******** | test-sa | | ajersamh4sjq******** | service-account-for-budget | +----------------------+------------------------------+
Сохраните идентификатор сервисного аккаунта
service-account-for-budget
. -
Назначьте сервисному аккаунту роли
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-архив с кодом функции
Перейдите в директорию yc-serverless-trigger-budget/steps/2-create-function/
и добавьте файлы в ZIP-архив src.zip
:
zip src.zip index.go go.mod
Создайте функцию Cloud Functions
- В консоли управления
перейдите в каталог, в котором создали сервисный аккаунт. - Выберите сервис Cloud Functions.
- Создайте функцию:
- Нажмите кнопку Создать функцию.
- Введите имя функции
function-for-budget
. - Нажмите кнопку Создать.
- Создайте версию функции:
- Выберите среду выполнения
golang119
, выключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить. - Укажите способ загрузки ZIP-архив и выберите архив, который создали на предыдущем шаге.
- Укажите точку входа
index.StopComputeInstances
. - В блоке Параметры укажите:
- Таймаут, c —
5
; - Память —
512 МБ
; - Сервисный аккаунт —
service-account-for-budget
; - Переменные окружения:
FOLDER_ID
— идентификатор каталога, в котором вы хотите останавливать виртуальные машины.TAG
—target-for-stop
.
- Таймаут, c —
- Нажмите кнопку Сохранить изменения.
- Выберите среду выполнения
-
Создайте функцию
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
-
Создайте версию функции
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
. -
Выберите платежный аккаунт.
-
В секции Общие сведения, в поле Идентификатор, скопируйте идентификатор платежного аккаунта. Он пригодится при создании триггера для бюджетов.
-
Перейдите на вкладку Бюджеты и нажмите кнопку Создать бюджет.
-
В блоке Общая информация укажите:
-
Имя —
vm-budget
. -
Тип —
К оплате
. -
Сумма — сумму расходов на потребление, например
10 ₽
. -
Период расчета —
Месячный
. -
Дата окончания — дату окончания действия бюджета.
Дата окончания устанавливает, когда бюджет перестанет считать потребление и отправлять уведомления. Дата окончания — последнее число месяца. Не может быть позже пяти лет от текущей даты.
-
Уведомить — выберите себя.
-
-
В блоке Область действия выберите каталог, в котором ведете работу, и сервис Compute Cloud.
-
В блоке Пороги укажите пороговые значения в процентах, при достижении которых:
- Указанным пользователям будут приходить уведомления.
- Будет срабатывать триггер для бюджетов.
Например, можно указать два порога —
50%
и100%
. -
Нажмите кнопку Создать.
-
В открывшемся окне появился новый бюджет
vm-budget
. В поле Идентификатор скопируйте идентификатор созданного бюджета. Он пригодится позднее при создании триггера.
Чтобы создать бюджет, воспользуйтесь методом create для ресурса Budget или вызовом gRPC API BudgetService/Create.
Создайте триггер для бюджетов
-
В консоли управления
перейдите в каталог, в котором создали сервисный аккаунт, функцию и бюджет. -
Выберите сервис Cloud Functions.
-
На панели слева выберите
Триггеры. -
Нажмите кнопку Создать триггер.
-
В блоке Базовые параметры:
- Введите имя триггера
vm-stop-trigger
. - В поле Тип выберите
Бюджет
. - В поле Запускаемый ресурс выберите
Функция
.
- Введите имя триггера
-
В блоке Настройки бюджета выберите платежный аккаунт и бюджет
vm-budget
, который создали на предыдущем шаге. -
В блоке Настройки функции выберите функцию
function-for-budget
и укажите:- тег версии функции. По умолчанию указан тег
$latest
. - сервисный аккаунт
service-account-for-budget
. От его имени будет вызываться функция.
- тег версии функции. По умолчанию указан тег
-
Нажмите кнопку Создать триггер.
Чтобы создать триггер для бюджетов, который вызывает функцию 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
Создайте виртуальные машины Compute Cloud
-
Выберите подсеть:
yc vpc subnet list
-
Создайте виртуальную машину:
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: {}
Аналогичным способом создайте еще две виртуальные машины — target-instance-2
и target-instance-3
. У последней укажите значение false
для метки target-for-stop
.
Проверьте, что ВМ останавливаются по триггеру
Дождитесь, когда будут достигнуты пороговые значения, которые вы указали в бюджете. Убедитесь, что триггер для бюджетов запустил функцию и виртуальные машины target-instance-1
и target-instance-2
остановились.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: