Масштабирование группы виртуальных машин по расписанию
Создайте группу ВМ Yandex Compute Cloud и настройте для нее масштабирование по расписанию. Размером группы ВМ будет управлять функция Yandex Cloud Functions, запускаемая по таймеру.
Чтобы настроить масштабирование группы ВМ с помощью штатных инструментов — через консоль управления, с помощью интерфейса командной строки (CLI) или API:
- Подготовьте облако к работе.
- Создайте вспомогательные ресурсы.
- Создайте группу ВМ.
- Создайте ресурсы Cloud Functions.
- Проверьте масштабирование группы ВМ.
Если созданные ресурсы вам больше не нужны, удалите их.
Также инфраструктуру для масштабирования группы ВМ можно развернуть через Terraform с помощью готового файла конфигурации.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
В качестве примера будет использоваться каталог с именем example-folder
.
Необходимые платные ресурсы
В стоимость инфраструктуры входят:
- Использование ВМ (см. тарифы Compute Cloud).
- Вызовы функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).
Создайте вспомогательные ресурсы
Создайте сервисный аккаунт
Сервисный аккаунт будет привязан к группе ВМ Compute Cloud и функции Cloud Functions.
- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- В поле Имя укажите
vm-scale-scheduled-sa
. - Нажмите
Добавить роль и выберите роли:compute.admin
— для управления группой ВМ.iam.serviceAccounts.user
— для привязки сервисного аккаунта к ВМ, входящим в группу.functions.functionInvoker
— для запуска функции Cloud Functions.
- Нажмите Создать.
-
Создайте сервисный аккаунт:
yc iam service-account create --name vm-scale-scheduled-sa \ --folder-name example-folder
Результат:
id: ajeab0cnib1p******** folder_id: b0g12ga82bcv******** created_at: "2022-03-15T09:44:35.989446Z" name: vm-scale-scheduled-sa
Подробнее о команде
yc iam service-account create
см. в справочнике CLI. -
Назначьте сервисному аккаунту роли:
-
compute.admin
— для управления группой ВМ:yc resource-manager folder add-access-binding example-folder \ --service-account-name vm-scale-scheduled-sa \ --role compute.admin \ --folder-name example-folder
-
iam.serviceAccounts.user
— для привязки сервисного аккаунта к ВМ, входящим в группу:yc resource-manager folder add-access-binding example-folder \ --service-account-name vm-scale-scheduled-sa \ --role iam.serviceAccounts.user \ --folder-name example-folder
-
functions.functionInvoker
— для запуска функции Cloud Functions:yc resource-manager folder add-access-binding example-folder \ --service-account-name vm-scale-scheduled-sa \ --role functions.functionInvoker \ --folder-name example-folder
Подробнее о команде
yc resource-manager folder add-access-binding
см. в справочнике CLI. -
См. раздел Как создать инфраструктуру с помощью Terraform.
-
Создайте сервисный аккаунт
vm-scale-scheduled-sa
. Для этого воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create. -
Назначьте сервисному аккаунту в текущем каталоге роли:
compute.admin
— для управления группой ВМ.iam.serviceAccounts.user
— для привязки сервисного аккаунта к ВМ, входящим в группу.functions.functionInvoker
— для запуска функции Cloud Functions.
Для этого воспользуйтесь методом REST API setAccessBindings для ресурса Folder или вызовом gRPC API FolderService/SetAccessBindings.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте облачную сеть
Группа ВМ будет размещена в облачной сети Yandex Virtual Private Cloud и ее подсетях.
- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Virtual Private Cloud.
- Справа сверху нажмите Создать сеть.
- В поле Имя укажите
vm-scale-scheduled-network
. - Выберите опцию Создать подсети.
- Нажмите Создать сеть.
-
Создайте сеть
vm-scale-scheduled-network
:yc vpc network create --name vm-scale-scheduled-network \ --folder-name example-folder
Результат:
id: enpabce123hd******** folder_id: b0g12ga82bcv******** created_at: "2022-03-15T09:55:50.004472Z" name: vm-scale-scheduled-network
Подробнее о команде
yc vpc network create
см. в справочнике CLI. -
Создайте подсеть
vm-scale-scheduled-subnet-a
в зоне доступностиru-central1-a
:yc vpc subnet create --name vm-scale-scheduled-subnet-a \ --folder-name example-folder \ --network-name vm-scale-scheduled-network --range 192.168.1.0/24 \ --zone ru-central1-a
Результат:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2022-03-15T09:56:51.859345Z" name: vm-scale-scheduled-subnet-a network_id: enpabce123hd******** zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
Подробнее о команде
yc vpc subnet create
см. в справочнике CLI. -
Создайте подсеть
vm-scale-scheduled-network-b
в зоне доступностиru-central1-b
:yc vpc subnet create --name vm-scale-scheduled-subnet-b \ --folder-name example-folder \ --network-name vm-scale-scheduled-network --range 192.168.2.0/24 \ --zone ru-central1-b
Результат:
id: b1csa2b3clid******** folder_id: b0g12ga82bcv******** created_at: "2022-03-15T09:57:48.934429Z" name: vm-scale-scheduled-subnet-b network_id: enpabce123hd******** zone_id: ru-central1-b v4_cidr_blocks: - 192.168.2.0/24
См. раздел Как создать инфраструктуру с помощью Terraform.
- Создайте сеть
vm-scale-scheduled-network
с помощью метода REST API create для ресурса Network или вызова gRPC API NetworkService/Create. - Создайте подсети
vm-scale-scheduled-subnet-a
в зоне доступностиru-central1-a
иvm-scale-scheduled-subnet-b
в зонеru-central1-b
с помощью метода REST API create для ресурса Subnet или вызова gRPC API SubnetService/Create.
Создайте группу виртуальных машин
Группа ВМ будет создана с ручным масштабированием, чтобы ее размером могла управлять функция Cloud Functions.
- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Compute Cloud.
- На панели слева выберите
Группы виртуальных машин. - Справа сверху нажмите Создать группу виртуальных машин.
- В блоке Базовые параметры:
- В поле Имя укажите
vm-scale-scheduled-ig
. - Выберите Сервисный аккаунт
vm-scale-scheduled-sa
.
- В поле Имя укажите
- В блоке Распределение в поле Зона доступности выберите
ru-central1-a
иru-central1-b
. - В блоке Шаблон виртуальной машины нажмите Задать и в открывшемся окне:
- В блоке Образ загрузочного диска выберите образ Ubuntu 20.04.
- В блоке Вычислительные ресурсы укажите следующие настройки:
- Платформа —
Intel Ice Lake
. - vCPU —
2
. - Гарантированная доля vCPU —
20%
. - RAM —
2 ГБ
.
- Платформа —
- В блоке Сетевые настройки:
- В поле Сеть выберите
vm-scale-scheduled-network
. - В поле Публичный адрес выберите
Без адреса
.
- В поле Сеть выберите
- В блоке Доступ:
- В поле Сервисный аккаунт выберите
vm-scale-scheduled-sa
. - В поле Логин укажите имя пользователя, который будет создан на ВМ. Придумайте имя самостоятельно.
- В поле SSH-ключ вставьте содержимое файла открытого ключа SSH. Создать пару ключей можно по инструкции.
- В поле Сервисный аккаунт выберите
- Нажмите Сохранить.
- В блоке В процессе создания и обновления разрешено укажите следующие настройки:
- Добавлять выше целевого значения —
2
. - Уменьшать относительно целевого значения —
2
. - Одновременно создавать —
2
. - Одновременно останавливать —
2
.
- Добавлять выше целевого значения —
- В блоке Масштабирование:
- В поле Тип выберите
Фиксированный
. - Укажите Размер
2
.
- В поле Тип выберите
- Нажмите Создать.
-
Получите идентификаторы ресурсов, созданных ранее:
-
Идентификатор сервисного аккаунта
vm-scale-scheduled-sa
:yc iam service-account get vm-scale-scheduled-sa \ --folder-name example-folder | grep "^id"
Результат:
id: ajeab0cnib1p********
Подробнее о команде
yc iam service-account get
см. в справочнике CLI. -
Идентификатор сети
vm-scale-scheduled-network
:yc vpc network get vm-scale-scheduled-network \ --folder-name example-folder | grep "^id"
Результат:
id: enpabce123hd********
Подробнее о команде
yc vpc network get
см. в справочнике CLI. -
Идентификатор подсети
vm-scale-scheduled-subnet-a
:yc vpc subnet get vm-scale-scheduled-subnet-a \ --folder-name example-folder | grep "^id"
Результат:
id: e1lnabc23r1c********
Подробнее о команде
yc vpc subnet get
см. в справочнике CLI. -
Идентификатор подсети
vm-scale-scheduled-subnet-b
:yc vpc subnet get vm-scale-scheduled-subnet-b \ --folder-name example-folder | grep "^id"
Результат:
id: b1csa2b3clid********
Подробнее о команде
yc vpc subnet get
см. в справочнике CLI.
-
-
Получите идентификатор последней версии публичного образа Ubuntu 20.04 LTS:
yc compute image get-latest-from-family ubuntu-2004-lts \ --folder-id standard-images | grep "^id"
Результат:
id: fd83n3uou8m0********
Подробнее о команде
yc compute image get-latest-from-family
см. в справочнике CLI. -
Вставьте полученные идентификаторы в файл
specification.yaml
со спецификацией группы ВМ:name: vm-scale-scheduled-ig service_account_id: <идентификатор_сервисного_аккаунта> allocation_policy: zones: - zone_id: ru-central1-a - zone_id: ru-central1-b instance_template: platform_id: standard-v3 resources_spec: memory: 2G cores: 2 core_fraction: 20 boot_disk_spec: mode: READ_WRITE disk_spec: type_id: network-hdd size: 15G image_id: <идентификатор_последней_версии_Ubuntu_20.04_LTS> network_interface_specs: - network_id: <идентификатор_сети> subnet_ids: - <идентификатор_подсети_в_зоне_ru-central1-a> - <идентификатор_подсети_в_зоне_ru-central1-b> primary_v4_address_spec: {} scale_policy: fixed_scale: size: 2 deploy_policy: max_unavailable: 2 max_creating: 2 max_expansion: 2 max_deleting: 2
-
Создайте группу ВМ с именем
vm-scale-scheduled-ig
по спецификацииspecification.yaml
:yc compute instance-group create --file specification.yaml \ --folder-name example-folder
Результат:
done (2m18s) id: cl0kabcquk1g******** folder_id: b0g12ga82bcv******** ... service_account_id: ajeab0cnib1p******** status: ACTIVE
См. раздел Как создать инфраструктуру с помощью Terraform.
-
Получите идентификаторы ресурсов, созданных ранее:
- Идентификатор сервисного аккаунта
vm-scale-scheduled-sa
— с помощью метода REST API get для ресурса ServiceAccount или вызова gRPC API ServiceAccountService/Get. - Идентификатор сети
vm-scale-scheduled-network
— с помощью метода REST API get для ресурса Network или вызова gRPC API NetworkService/Get. - Идентификаторы подсетей
vm-scale-scheduled-subnet-a
иvm-scale-scheduled-subnet-b
— с помощью метода REST API get для ресурса Subnet или вызова gRPC API SubnetService/Get.
- Идентификатор сервисного аккаунта
-
Получите идентификатор последней версии публичного образа Ubuntu 20.04 в семействе
standard-images
с помощью метода REST API getLatestByFamily для ресурса Image или вызова gRPC API ImageService/GetLatestByFamily. -
Вставьте полученные идентификаторы в файл
specification.yaml
со спецификацией группы ВМ:name: vm-scale-scheduled-ig service_account_id: <идентификатор_сервисного_аккаунта> allocation_policy: zones: - zone_id: ru-central1-a - zone_id: ru-central1-b instance_template: platform_id: standard-v3 resources_spec: memory: 2G cores: 2 core_fraction: 20 boot_disk_spec: mode: READ_WRITE disk_spec: type_id: network-hdd size: 15G image_id: <идентификатор_последней_версии_Ubuntu_20.04_LTS> network_interface_specs: - network_id: <идентификатор_сети> subnet_ids: - <идентификатор_подсети_в_зоне_ru-central1-a> - <идентификатор_подсети_в_зоне_ru-central1-b> primary_v4_address_spec: {} scale_policy: fixed_scale: size: 2 deploy_policy: max_unavailable: 2 max_creating: 2 max_expansion: 2 max_deleting: 2
-
Создайте группу ВМ с именем
vm-scale-scheduled-ig
по спецификацииspecification.yaml
с помощью метода REST API createFromYaml для ресурса InstanceGroup или вызова gRPC API InstanceGroupService/CreateFromYaml.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте ресурсы Cloud Functions
Создайте функцию
Функция будет содержать код с командами CLI Yandex Cloud, которые изменяют группу ВМ.
-
В консоли управления
выберите каталогexample-folder
. -
Выберите сервис Cloud Functions.
-
Справа сверху нажмите Создать функцию.
-
В поле Имя укажите
vm-scale-scheduled-function
. -
Нажмите Создать.
-
Выберите среду выполнения Bash.
-
Включите опцию Добавить файлы с примерами кода.
-
Нажмите Продолжить.
-
В блоке Редактор выберите файл
handler.sh
. -
Вставьте вместо содержимого файла следующий код:
# Get ID and current size of the instance group IG_SPEC=$(yc compute instance-group get --name $IG_NAME --folder-id $FOLDER_ID --format json) IG_ID=$(jq -r ".id" <<< $IG_SPEC) IG_SIZE=$(jq -r ".scale_policy.fixed_scale.size" <<< $IG_SPEC) # Calculate new size for the instance group if [ $IG_SIZE = $IG_BASE_SIZE ]; then IG_SIZE="$(($IG_BASE_SIZE + 1))" else IG_SIZE=$IG_BASE_SIZE fi # Update the instance group yc compute instance-group update --id $IG_ID --scale-policy-fixed-scale-size $IG_SIZE
-
В блоке Параметры:
- В поле Таймаут, c укажите значение
60
. - В поле Сервисный аккаунт выберите
vm-scale-scheduled-sa
. - В блоке Переменные окружения добавьте следующие переменные:
IG_NAME
=vm-scale-scheduled-ig
.IG_BASE_SIZE
=2
.FOLDER_ID
= идентификатор каталога. Получить идентификатор можно по инструкции.
- В поле Таймаут, c укажите значение
-
В правом верхнем углу нажмите Сохранить изменения.
-
Создайте файл
handler.sh
со следующим кодом:# Get ID and current size of the instance group IG_SPEC=$(yc compute instance-group get --name $IG_NAME --folder-id $FOLDER_ID --format json) IG_ID=$(jq -r ".id" <<< $IG_SPEC) IG_SIZE=$(jq -r ".scale_policy.fixed_scale.size" <<< $IG_SPEC) # Calculate new size for the instance group if [ $IG_SIZE = $IG_BASE_SIZE ]; then IG_SIZE="$(($IG_BASE_SIZE + 1))" else IG_SIZE=$IG_BASE_SIZE fi # Update the instance group yc compute instance-group update --id $IG_ID --scale-policy-fixed-scale-size $IG_SIZE
-
Создайте функцию:
yc serverless function create vm-scale-scheduled-function \ --folder-name example-folder
Результат:
done (1s) id: d4e7d67ikvmq******** folder_id: b1g9hv2loamq******** ... log_group_id: ckgij6l0845h******** http_invoke_url: https://functions.yandexcloud.net/d4e7d67ikvmq******** status: ACTIVE
-
Создайте версию функции:
yc serverless function version create --folder-name example-folder \ --function-name vm-scale-scheduled-function --runtime bash \ --source-path ./handler.sh --entrypoint "handler.sh" \ --execution-timeout 60s \ --service-account-id <идентификатор_сервисного_аккаунта> \ --environment \ IG_NAME=vm-scale-scheduled-ig,IG_BASE_SIZE=2,FOLDER_ID=<идентификатор_каталога>
Где:
- Опция
--service-account-id
— идентификатор сервисного аккаунтаvm-scale-schedule-sa
. Получить идентификатор можно по инструкции в шаге Создайте группу ВМ, на вкладке CLI. - Переменная
FOLDER_ID
в опции--environment
— идентификатор каталога. Получить идентификатор можно по инструкции.
Результат:
done (1s) id: d4efmv9n3qf1******** function_id: d4e7d67ikvmq******** ... FOLDER_ID: b1g9hv2loamq******** IG_BASE_SIZE: "2" IG_NAME: vm-scale-scheduled-ig
- Опция
См. раздел Как создать инфраструктуру с помощью Terraform.
-
Создайте функцию
vm-scale-scheduled-function
с помощью метода REST API create для ресурса Function или вызова gRPC API FunctionService/Create. Из ответных данных получите идентификатор созданной функции. -
Создайте версию функции с помощью метода REST API createVersion для ресурса Function или вызова gRPC API FunctionService/CreateVersion. Версия функции должна иметь следующий код:
# Get ID and current size of the instance group IG_SPEC=$(yc compute instance-group get --name $IG_NAME --folder-id $FOLDER_ID --format json) IG_ID=$(jq -r ".id" <<< $IG_SPEC) IG_SIZE=$(jq -r ".scale_policy.fixed_scale.size" <<< $IG_SPEC) # Calculate new size for the instance group if [ $IG_SIZE = $IG_BASE_SIZE ]; then IG_SIZE="$(($IG_BASE_SIZE + 1))" else IG_SIZE=$IG_BASE_SIZE fi # Update the instance group yc compute instance-group update --id $IG_ID --scale-policy-fixed-scale-size $IG_SIZE
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте триггер
Триггер определяет условия запуска функции. Для запуска по расписанию используется триггер-таймер.
- В консоли управления
выберите каталогexample-folder
. - Выберите сервис Cloud Functions.
- На панели слева выберите
Триггеры. - Справа сверху нажмите Создать триггер.
- В блоке Базовые параметры:
- В поле Имя укажите
vm-scale-scheduled-trigger
. - В поле Тип выберите
Таймер
. - В поле Запускаемый ресурс выберите
Функция
.
- В поле Имя укажите
- В блоке Настройки таймера в поле Cron-выражение укажите
*/2 * * * ? *
— триггер будет срабатывать каждые две минуты, например, в 09:58, 10:00, 10:02, 10:04 и т. д. - В блоке Настройки функции:
- В поле Функция укажите
vm-scale-scheduled-function
. - В поле Тег версии функции выберите
$latest
. - Выберите Сервисный аккаунт
vm-scale-scheduled-sa
.
- В поле Функция укажите
- В блоке Настройки Dead Letter Queue очистите поле Сервисный аккаунт (
Не выбрано
). - Нажмите Создать триггер.
Выполните следующую команду:
yc serverless trigger create timer --folder-name example-folder \
--name vm-scale-scheduled-trigger \
--cron-expression "*/2 * * * ? *" \
--invoke-function-name vm-scale-scheduled-function \
--invoke-function-tag '$latest' \
--invoke-function-service-account-name vm-scale-scheduled-sa
Результат:
id: a1s22pb0v5i4********
folder_id: b1g9hv2loamq********
created_at: "2022-04-06T14:56:54.253709098Z"
...
function_tag: $latest
service_account_id: aje9s4pud13h********
status: ACTIVE
См. раздел Как создать инфраструктуру с помощью Terraform.
Используйте метод REST API create для ресурса Trigger или вызов gRPC API TriggerService/Create, чтобы создать триггер типа timer
с cron-выражением */2 * * * ? *
, связанный с функцией vm-scale-scheduled-function
версии $latest
и сервисным аккаунтом vm-scale-scheduled-sa
.
Проверьте масштабирование группы ВМ
- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Compute Cloud.
- На панели слева выберите
Группы виртуальных машин. - Выберите группу
vm-scale-scheduled-ig
. - Убедитесь, что в блоке Состояния виртуальных машин каждые две минуты изменяется количество ВМ: увеличивается с 2 до 3, затем уменьшается с 3 до 2 и т. д. Также вы можете проверить обновление группы на вкладке
Операции.
Несколько раз выполните следующую команду:
yc compute instance-group get vm-scale-scheduled-ig \
--folder-name example-folder
Результат:
id: cl1l0ljqbmkp********
folder_id: b1g9hv2loamq********
created_at: "2022-03-28T13:24:20.693Z"
...
managed_instances_state:
target_size: "2"
running_actual_count: "2"
...
Значение в поле target_size
(целевой размер группы) должно меняться с 2
на 3
и обратно.
Несколько раз получите информацию о группе ВМ vm-scale-scheduled-ig
с помощью метода REST API get для ресурса InstanceGroup или вызова gRPC API InstanceGroupService/Get. Значение в поле target_size
(целевой размер группы) должно меняться с 2
на 3
и обратно.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- Удалите триггер
vm-scale-scheduled-trigger
. - Удалите функцию
vm-scale-scheduled-function
. - Удалите группу ВМ
vm-scale-scheduled-ig
.
Как создать инфраструктуру с помощью Terraform
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Чтобы настроить масштабирование группы ВМ с помощью Terraform:
-
Установите Terraform и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовый архивВручную- Создайте папку для файлов.
- Скачайте архив
(2 КБ). - Разархивируйте архив в папку. В результате в ней должны появиться конфигурационный файл
vm-scale-scheduled.tf
и архив с кодом функции Cloud Functionsvm-scale-scheduled-function.zip
.
-
Создайте папку для файлов.
-
Создайте в папке:
-
Конфигурационный файл
vm-scale-scheduled.tf
:vm-scale-scheduled.tf
locals { token = "<OAuth-_или_IAM-токен>" cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" username = "<имя_пользователя_ВМ>" ssh_key_path = "<путь_к_публичному_SSH-ключу>" } terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { token = local.token cloud_id = local.cloud_id folder_id = local.folder_id } resource "yandex_iam_service_account" "vm-scale-scheduled-sa" { name = "vm-scale-scheduled-sa" } resource "yandex_resourcemanager_folder_iam_member" "vm-scale-scheduled-sa-role-compute" { folder_id = "<идентификатор_каталога>" role = "compute.admin" member = "serviceAccount:${yandex_iam_service_account.vm-scale-scheduled-sa.id}" } resource "yandex_resourcemanager_folder_iam_member" "vm-scale-scheduled-sa-role-iam" { folder_id = "<идентификатор_каталога>" role = "iam.serviceAccounts.user" member = "serviceAccount:${yandex_iam_service_account.vm-scale-scheduled-sa.id}" } resource "yandex_resourcemanager_folder_iam_member" "vm-scale-scheduled-sa-role-functions" { folder_id = "<идентификатор_каталога>" role = "functions.functionInvoker" member = "serviceAccount:${yandex_iam_service_account.vm-scale-scheduled-sa.id}" } resource "yandex_vpc_network" "vm-scale-scheduled-network" { name = "vm-scale-scheduled-network" } resource "yandex_vpc_subnet" "vm-scale-scheduled-subnet-a" { name = "vm-scale-scheduled-subnet-a" zone = "ru-central1-a" v4_cidr_blocks = ["192.168.1.0/24"] network_id = yandex_vpc_network.vm-scale-scheduled-network.id } resource "yandex_vpc_subnet" "vm-scale-scheduled-subnet-b" { name = "vm-scale-scheduled-subnet-b" zone = "ru-central1-b" v4_cidr_blocks = ["192.168.2.0/24"] network_id = yandex_vpc_network.vm-scale-scheduled-network.id } resource "yandex_compute_image" "vm-scale-scheduled-image" { source_family = "ubuntu-2004-lts" } resource "yandex_compute_instance_group" "vm-scale-scheduled-ig" { name = "vm-scale-scheduled-ig" service_account_id = yandex_iam_service_account.vm-scale-scheduled-sa.id allocation_policy { zones = [ "ru-central1-a", "ru-central1-b" ] } instance_template { boot_disk { mode = "READ_WRITE" initialize_params { image_id = yandex_compute_image.vm-scale-scheduled-image.id size = 15 } } platform_id = "standard-v3" resources { cores = 2 core_fraction = 20 memory = 2 } network_interface { network_id = yandex_vpc_network.vm-scale-scheduled-network.id subnet_ids = [ yandex_vpc_subnet.vm-scale-scheduled-subnet-a.id, yandex_vpc_subnet.vm-scale-scheduled-subnet-b.id ] } metadata = { user-data = "#cloud-config\nusers:\n - name: ${local.username}\n groups: sudo\n shell: /bin/bash\n sudo: 'ALL=(ALL) NOPASSWD:ALL'\n ssh_authorized_keys:\n - ${file("${local.ssh_key_path}")}" } } scale_policy { fixed_scale { size = 2 } } deploy_policy { max_unavailable = 2 max_creating = 2 max_expansion = 2 max_deleting = 2 } depends_on = [ yandex_resourcemanager_folder_iam_member.vm-scale-scheduled-sa-role-compute, yandex_resourcemanager_folder_iam_member.vm-scale-scheduled-sa-role-iam ] } resource "yandex_function" "vm-scale-scheduled-function" { name = "vm-scale-scheduled-function" runtime = "bash" user_hash = "function-v1" entrypoint = "handler.sh" content { zip_filename = "vm-scale-scheduled-function.zip" } execution_timeout = "60" memory = "128" service_account_id = yandex_iam_service_account.vm-scale-scheduled-sa.id environment = { IG_NAME = yandex_compute_instance_group.vm-scale-scheduled-ig.name IG_BASE_SIZE = "2" FOLDER_ID = local.folder_id } depends_on = [ yandex_resourcemanager_folder_iam_member.vm-scale-scheduled-sa-role-functions ] } resource "yandex_function_trigger" "vm-scale-scheduled-trigger" { name = "vm-scale-scheduled-trigger" timer { cron_expression = "*/2 * * * ? *" } function { id = yandex_function.vm-scale-scheduled-function.id tag = "$latest" service_account_id = yandex_iam_service_account.vm-scale-scheduled-sa.id } depends_on = [ yandex_resourcemanager_folder_iam_member.vm-scale-scheduled-sa-role-functions ] }
-
Файл с кодом функции Cloud Functions
handler.sh
:handler.sh
Важно
# Get ID and current size of the instance group IG_SPEC=$(yc compute instance-group get --name $IG_NAME --folder-id $FOLDER_ID --format json) IG_ID=$(jq -r ".id" <<< $IG_SPEC) IG_SIZE=$(jq -r ".scale_policy.fixed_scale.size" <<< $IG_SPEC) # Calculate new size for the instance group if [ $IG_SIZE = $IG_BASE_SIZE ]; then IG_SIZE="$(($IG_BASE_SIZE + 1))" else IG_SIZE=$IG_BASE_SIZE fi # Update the instance group yc compute instance-group update --id $IG_ID --scale-policy-fixed-scale-size $IG_SIZE
-
-
Создайте в папке архив
vm-scale-scheduled-function.zip
, содержащий файлhandler.sh
. После этого удалите файлhandler.sh
вне архива.
-
В файле
vm-scale-scheduled.tf
вставьте в блокlocals
следующие значения:token
— OAuth-токен (если вы используете аккаунт на Яндексе) или Yandex Identity and Access Management-токен (если вы используете аккаунт на Яндексе или федеративный аккаунт) для доступа к Yandex Cloud. Время жизни Identity and Access Management-токена — максимум 12 часов, но не больше времени жизни cookie у федерации.cloud_id
— идентификатор облака, в котором будут создаваться ресурсы.folder_id
— идентификатор каталога, в котором будут создаваться ресурсы.username
— имя пользователя, который будет создан на ВМ. Придумайте имя самостоятельно.ssh_key_path
— путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ. Создать пару ключей можно по инструкции.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-