Создание триггера для бюджетов, который вызывает функцию 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), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --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. - В блоке Параметры укажите:
- Таймаут —
5; - Память —
512 МБ; - Сервисный аккаунт —
service-account-for-budget; - Переменные окружения:
FOLDER_ID— идентификатор каталога, в котором вы хотите останавливать виртуальные машины.TAG—target-for-stop.
- Таймаут —
- Нажмите кнопку Сохранить изменения.
- Выберите среду выполнения
-
Создайте функцию
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 kz1-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: kz1-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 остановились.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: