Создание триггера для бюджетов, который вызывает функцию 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
остановились.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: