Автоматическое масштабирование группы виртуальных машин для обработки сообщений из очереди Yandex Message Queue
Сценарий описывает интеграцию между сервисами Yandex Compute Cloud, Yandex Message Queue и Yandex Monitoring.
В сценарии создается группа виртуальных машин. Все ВМ в группе обрабатывают сообщения из одной очереди Message Queue (для примера — получают их и через некоторое время удаляют). Количество сообщений в очереди записывается в метрику Monitoring, и группа ВМ автоматически масштабируется по этой метрике.
Для масштабирования выбрана деликатная стратегия остановки: ВМ останавливаются самостоятельно после обработки всех сообщений и только после этого удаляются из группы при уменьшении ее размера. Это гарантирует, что ВМ не будут удалены принудительно и обработают последние сообщения, даже если очередь опустеет до конца обработки.
Чтобы выполнить сценарий:
- Подготовьте окружение.
- Создайте очередь в Message Queue.
- Создайте образ с приложением.
- Создайте группу виртуальных машин.
- Проверьте масштабирование группы виртуальных машин.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
В качестве примера в сценарии будет использоваться каталог с именем example-folder
.
Необходимые платные ресурсы
В стоимость инфраструктуры входят:
- плата за использование виртуальных машин и хранение образа (см. тарифы Compute Cloud);
- плата за использование публичных IP-адресов и исходящий трафик с ВМ (см. тарифы Virtual Private Cloud);
- плата за запросы к очереди (см. тарифы Message Queue).
Подготовьте окружение
Создайте вспомогательные ресурсы Yandex Cloud
-
Создайте сервисный аккаунт
queue-autoscale-sa
и назначьте ему рольeditor
в каталогеexample-folder
:- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- В поле Имя укажите
queue-autoscale-sa
. - Нажмите значок
Добавить роль и выберите рольeditor
. - Нажмите кнопку Создать.
- В консоли управления
-
Создайте статический ключ доступа для работы сервисного аккаунта с Message Queue и сохраните его в файл
access_key
:-
В списке сервисных аккаунтов выберите
queue-autoscale-sa
. -
Нажмите
Создать новый ключ и выберите Создать статический ключ доступа. -
В поле Описание укажите
Message Queue
. -
Нажмите кнопку Создать.
-
Вставьте идентификатор ключа и секретный ключ в файл
access_key
в следующем формате:access_key: key_id: <идентификатор_ключа> secret: <секретный_ключ>
-
-
Создайте облачную сеть
queue-autoscale-network
:- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Virtual Private Cloud.
- Нажмите кнопку Создать сеть.
- В поле Имя укажите
queue-autoscale-network
. - Отключите опцию Создать подсети.
- Нажмите кнопку Создать сеть.
- В консоли управления
-
Создайте подсеть
queue-autoscale-subnet-a
в зонеru-central1-a
:-
В списке сетей выберите
queue-autoscale-network
. -
Нажмите кнопку
Создать подсеть. -
Укажите параметры подсети:
- Имя —
queue-autoscale-subnet-a
. - Зона —
ru-central1-a
. - CIDR —
192.168.1.0/24
.
- Имя —
-
Нажмите кнопку Создать подсеть.
-
-
Создайте сервисный аккаунт
queue-autoscale-sa
:yc iam service-account create --name queue-autoscale-sa
Где
--name
— имя сервисного аккаунта:queue-autoscale-sa
.Результат:
id: aje6brh817ro******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:19:10.153346507Z" name: queue-autoscale-sa
-
Назначьте сервисному аккаунту роль
editor
в каталогеexample-folder
:yc resource-manager folder add-access-binding example-folder \ --service-account-name queue-autoscale-sa \ --role editor
Где:
--service-account-name
— имя сервисного аккаунта, созданного на шаге 1:queue-autoscale-sa
.--role
— назначаемая роль:editor
.
Результат:
done (1s)
-
Создайте статический ключ доступа для работы сервисного аккаунта с Message Queue и сохраните его в файл
access_key
:yc iam access-key create \ --service-account-name queue-autoscale-sa \ --description "Message Queue" \ | tee access_key
Где:
--service-account-name
— имя сервисного аккаунта, созданного на шаге 1:queue-autoscale-sa
.--description
— описание ключа.
Результат:
access_key: id: ajevb6bx51w3******** service_account_id: aje6brh817ro******** created_at: "2021-10-04T16:25:19.143847764Z" description: Message Queue key_id: g3VybpVKdq_Y******** secret: WVUqnwmC4LSUep0GTKGkbcht9K3Xav7V********
-
Создайте облачную сеть
queue-autoscale-network
:yc vpc network create queue-autoscale-network
Результат:
id: enpabce123hd******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:28:15.905337847Z" name: queue-autoscale-network
-
Создайте подсеть
queue-autoscale-subnet-a
в зонеru-central1-a
:yc vpc subnet create queue-autoscale-subnet-a \ --network-name queue-autoscale-network --range 192.168.1.0/24 --zone ru-central1-a
Где:
--network-name
— имя сети, в которой создается подсеть:queue-autoscale-network
.--range
— CIDR подсети.--zone
— зона доступности, в которой создается подсеть:ru-central1-a
.
Результат:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:29:12.450858436Z" name: queue-autoscale-subnet-a network_id: enpabce123hd******** zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
-
Создайте сервисный аккаунт
queue-autoscale-sa
с помощью вызова gRPC API ServiceAccountService/Create или метода REST API create. В ответных данных будет указан идентификатор сервисного аккаунта. -
Назначьте сервисному аккаунту роль
editor
в каталогеexample-folder
с помощью вызова gRPC API FolderService/UpdateAccessBindings или метода REST API updateAccessBindings. В теле запроса укажите идентификатор сервисного аккаунта. -
Создайте статический ключ доступа для работы сервисного аккаунта с Message Queue и сохраните его в файл
access_key
:-
Используйте вызов gRPC API AccessKeyService/Create или метод REST API create.
-
Вставьте идентификатор ключа и секретный ключ в файл
access_key
в следующем формате:access_key: key_id: <идентификатор_ключа> secret: <секретный_ключ>
-
-
Создайте облачную сеть
queue-autoscale-network
с помощью вызова gRPC API NetworkService/Create или метода REST API create. В ответных данных будет указан идентификатор сети. -
Создайте подсеть
queue-autoscale-subnet-a
в зонеru-central1-a
с CIDR192.168.1.0/24
с помощью вызова gRPC API SubnetService/Create или метода REST API create. В теле запроса укажите идентификатор сети.
Настройте AWS CLI
Примечание
С помощью AWS CLI выполняется последний шаг сценария — проверка масштабирования группы виртуальных машин. Поэтому его нужно установить и настроить, даже если вы не будете использовать его для других шагов.
-
Скачайте и установите AWS CLI, как описано в его документации
. -
Настройте AWS CLI для работы с Yandex Cloud:
-
Создайте в домашнем каталоге файл
.aws/credentials
и укажите в нем статический ключ доступа, полученный ранее, и его идентификатор:[default] aws_access_key_id = <идентификатор_ключа> aws_secret_access_key = <секретный_ключ>
-
Создайте в домашнем каталоге файл
.aws/config
и укажите в нем регион по умолчаниюru-central1
:[default] region = ru-central1
-
Создайте очередь в Message Queue
-
Создайте очередь
queue-autoscale-queue
:- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Message Queue.
- Нажмите кнопку Создать очередь.
- В поле Имя укажите
queue-autoscale-queue
. - Нажмите кнопку Создать.
- В консоли управления
-
Сохраните URL очереди в файл
queue
:-
В списке очередей выберите
queue-autoscale-queue
. -
Скопируйте URL очереди.
-
Вставьте URL в файл
queue
в следующем формате:QueueUrl: <URL_очереди>
-
-
Создайте очередь
queue-autoscale-queue
и сохраните ее URL в файлqueue
:aws sqs create-queue \ --endpoint https://message-queue.api.cloud.yandex.net \ --queue-name queue-autoscale-queue \ --output yaml \ | tee queue
Где:
--endpoint
— корневой URL API Message Queue:https://message-queue.api.cloud.yandex.net
.--queue-name
— имя очереди:queue-autoscale-queue
.
Результат:
QueueUrl: https://message-queue.api.cloud.yandex.net/b1gvlrnlei4l********/dj6000000003********/queue-autoscale-queue
-
Создайте очередь
queue-autoscale-queue
с помощью метода API CreateQueue. В ответных данных будет указан URL очереди. -
Вставьте URL очереди в файл
queue
в следующем формате:QueueUrl: <URL_очереди>
Создайте образ с приложением
-
Если у вас еще не установлен Packer, скачайте и установите его по инструкции
на официальном сайте. Также вы можете скачать дистрибутив Packer для вашей платформы из зеркала .Примечание
Для работы с Yandex Cloud требуется Packer версии не ниже 1.5.
-
Настройте плагин Yandex Compute Builder
:-
Создайте файл
config.pkr.hcl
со следующим содержанием:packer { required_plugins { yandex = { version = ">= 1.1.2" source = "github.com/hashicorp/yandex" } } }
-
Установите плагин:
packer init <путь_к_файлу_config.pkr.hcl>
Результат:
Installed plugin github.com/hashicorp/yandex v1.1.2 in ...
-
-
Скачайте архив с файлами для образа
(ZIP, 3 КБ) и распакуйте его:wget https://storage.yandexcloud.net/doc-files/queue-autoscale-server.zip unzip queue-autoscale-server.zip
-
В файле
server-packer.json
измените объект в массивеbuilders
:-
В поле
service_account_id
укажите идентификатор сервисного аккаунтаqueue-autoscale-sa
.Как узнать идентификатор сервисного аккаунта
Консоль управленияCLIAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Identity and Access Management.
- На панели слева выберите
Сервисные аккаунты. - В открывшемся списке выберите сервисный аккаунт
queue-autoscale-sa
. - Скопируйте Идентификатор сервисного аккаунта.
Выполните следующую команду:
yc iam service-account get queue-autoscale-sa
Результат:
id: aje6brh817ro******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:19:10.153346507Z" name: queue-autoscale-sa
Воспользуйтесь методом REST API list для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/List.
- В консоли управления
-
В поле
folder_id
укажите идентификатор каталога в Yandex Cloud.Как узнать идентификатор каталога
Консоль управленияCLIAPIНа странице облака
в списке Каталоги найдите каталогexample-folder
и скопируйте его Идентификатор.Выполните следующую команду:
yc resource-manager folder get example-folder
Результат:
id: b1g9hv2loamq******** cloud_id: b1g2y61sxwqx******** created_at: "2021-10-04T13:21:32.788067492Z" name: example-folder status: ACTIVE
Воспользуйтесь методом REST API list для ресурса Folder или вызовом gRPC API FolderService/List.
-
В поле
subnet_id
укажите идентификатор подсетиqueue-autoscale-subnet-a
.Как узнать идентификатор подсети
Консоль управленияCLIAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Virtual Private Cloud.
- Перейдите на вкладку
Подсети. - В списке подсетей найдите
queue-autoscale-subnet-a
и скопируйте ее Идентификатор.
Выполните следующую команду:
yc vpc subnet get queue-autoscale-subnet-a
Результат:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:29:12.450858436Z" name: queue-autoscale-subnet-a network_id: enpabce123hd******** zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
Воспользуйтесь методом REST API list для ресурса Subnet или вызовом gRPC API SubnetService/List.
- В консоли управления
-
-
Получите IAM-токен для работы сервисного аккаунта с Compute Cloud и сохраните его в файл
key.json
:CLIAPIyc iam key create \ --service-account-name queue-autoscale-sa \ --description "Compute Cloud" \ --output key.json
Где:
--service-account-name
— имя сервисного аккаунта, созданного ранее:queue-autoscale-sa
.--description
— описание ключа.--output
— путь к файлу, в который нужно сохранить ключ:key.json
.
Результат:
id: ajevh3a0hrqf******** service_account_id: aje6brh817ro******** created_at: "2021-10-04T16:35:19.057777570Z" description: Compute Cloud key_algorithm: RSA_2048
Воспользуйтесь методом REST API create для ресурса Key или вызовом gRPC API KeyService/Create.
-
Выполните команду для создания образа:
packer build server-packer.json
Результат:
... Build 'builder' finished after 2 minutes 48 seconds. ==> Wait completed after 2 minutes 48 seconds ==> Builds finished. The artifacts of successful builds are: --> builder: A disk image was created: queue-autoscale-image-v1633354734 (id: fd8hlbuhjc4m********) with family name queue-autoscale-image
Создайте группу виртуальных машин
-
В консоли управления
выберите каталогexample-folder
. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Группы виртуальных машин. -
Нажмите кнопку Создать группу виртуальных машин.
-
В блоке Базовые параметры:
- В поле Имя укажите
queue-autoscale-ig
. - Выберите Сервисный аккаунт
queue-autoscale-sa
.
- В поле Имя укажите
-
В блоке Распределение в поле Зона доступности выберите
ru-central1-a
. -
В блоке Шаблон виртуальной машины нажмите Задать и в открывшемся окне:
-
В блоке Образ загрузочного диска перейдите на вкладку Пользовательский и нажмите Выбрать.
-
В открывшемся окне выберите созданный образ в качестве загрузочного диска:
- Перейдите на вкладку Образ.
- Выберите образ, имя которого начинается на
queue-autoscale-image
. - Нажмите кнопку Применить.
-
В блоке Сетевые настройки:
- В поле Сеть выберите
queue-autoscale-network
. - В поле Публичный адрес выберите
Автоматически
, чтобы ВМ имели доступ в интернет и могли получать сообщения из очереди.
- В поле Сеть выберите
-
В блоке Доступ:
- В поле Сервисный аккаунт выберите
queue-autoscale-sa
. - Укажите логин и содержимое открытого ключа для подключения к ВМ.
- В поле Сервисный аккаунт выберите
-
Нажмите кнопку Сохранить.
-
-
В блоке В процессе создания и обновления разрешено укажите следующие значения:
- Одновременно останавливать —
1
. - Останавливать машины по стратегии —
Ручная
.
- Одновременно останавливать —
-
В блоке Масштабирование укажите следующие значения:
- Тип —
Автоматический
. - Тип автомасштабирования —
Региональное
. - Минимальное количество ВМ в зоне —
0
. - Максимальный размер группы —
5
. - Промежуток измерения нагрузки —
60 секунд
. - Время на разогрев ВМ —
0 минут
. - Период стабилизации —
5 минут
. - Начальный размер группы —
1
.
- Тип —
-
В блоке Метрики укажите следующие значения:
- Метрика —
Yandex Monitoring
. - Идентификатор каталога —
message-queue
. - Имя метрики —
queue.messages.stored_count
. - Метки — ключ
queue
, значениеqueue-autoscale-queue
. - Тип метрики —
GAUGE
. - Тип правила —
WORKLOAD
. - Целевое значение —
5
.
- Метрика —
-
Нажмите кнопку Создать.
-
Получите идентификатор образа, созданного ранее:
yc compute image get-latest-from-family queue-autoscale-image
Результат:
id: fd8hlbuhjc4m******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:38:54.345168059Z" name: queue-autoscale-image-v1633354734 description: Image for autoscaling an instance group based on the size of a queue family: queue-autoscale-image storage_size: "3858759680" min_disk_size: "5368709120" product_ids: - f2e6fnj3erf1******** status: READY os: type: LINUX
-
Измените файл со спецификацией группы ВМ
spec.yaml
:-
В поле
folder_id
укажите идентификатор каталога в Yandex Cloud. -
В поле
image_id
укажите идентификатор созданного образа. -
В поле
network_id
укажите идентификатор сетиqueue-autoscale-network
, а в полеsubnet_ids
— идентификатор подсетиqueue-autoscale-subnet-a
.Как узнать идентификатор сети
CLIКонсоль управленияAPIВыполните команду:
yc vpc network get queue-autoscale-network
Результат:
id: enpabce123hd******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:28:15.905337847Z" name: queue-autoscale-network
- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Virtual Private Cloud.
- В списке сетей найдите
queue-autoscale-network
и скопируйте ее Идентификатор.
Воспользуйтесь методом REST API list для ресурса Network или вызовом gRPC API NetworkService/List.
- В консоли управления
-
В поле
service_account_id
укажите идентификатор сервисного аккаунтаqueue-autoscale-sa
.
Как получить идентификаторы ресурсов (кроме образа и сети), см. в шаге 3 раздела Создайте образ с приложением.
-
-
Создайте группу ВМ
queue-autoscale-ig
по спецификации:yc compute instance-group create --file spec.yaml
Где
--file
— путь к файлу со спецификацией группы ВМ:spec.yaml
.
-
Получите идентификатор образа из семейства
queue-autoscale-image
, созданного ранее, с помощью вызова gRPC API ImageService/GetLatestByFamily или метода REST API getLatestByFamily. -
Измените файл со спецификацией группы виртуальных
spec.yaml
:-
В поле
folder_id
укажите идентификатор каталога в Yandex Cloud. -
В поле
image_id
укажите идентификатор созданного образа. -
В поле
network_id
укажите идентификатор сетиqueue-autoscale-network
, а в полеsubnet_ids
— идентификатор подсетиqueue-autoscale-subnet-a
.Как узнать идентификатор сети
Консоль управленияCLIAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Virtual Private Cloud.
- В списке сетей найдите
queue-autoscale-network
и скопируйте ее Идентификатор.
Выполните следующую команду:
yc vpc network get queue-autoscale-network
Результат:
id: enpabce123hd******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:28:15.905337847Z" name: queue-autoscale-network
Воспользуйтесь методом REST API list для ресурса Network или вызовом gRPC API NetworkService/List.
- В консоли управления
-
В поле
service_account_id
укажите идентификатор сервисного аккаунтаqueue-autoscale-sa
.
Как получить идентификаторы ресурсов (кроме образа и сети), см. в шаге 3 раздела Создайте образ с приложением.
-
-
Создайте группу ВМ
queue-autoscale-ig
по спецификацииspec.yaml
с помощью вызова gRPC API InstanceGroupService/CreateFromYaml или метода REST API createFromYaml.
Проверьте масштабирование группы виртуальных машин
-
Измените файл
messages.sh
: в параметре--queue-url
укажите URL очереди из файлаqueue
. -
Запустите файл
messages.sh
. Начнется поочередная отправка 100 сообщений в очередьqueue-autoscale-queue
. -
Откройте дашборды в Yandex Monitoring:
Консоль управления-
Откройте дашборд с информацией о группе ВМ:
- В Monitoring
выберите сервисный дашборд Compute — Instance Groups. - В поле Instance Group ID выберите
queue-autoscale-ig
.
- В Monitoring
-
Откройте дашборд с информацией об очереди:
- В Monitoring
выберите сервисный дашборд Message Queue. - В поле Queue ID выберите
queue-autoscale-queue
.
- В Monitoring
-
-
По данным дашбордов убедитесь, что последовательно произошли следующие события:
- Очередь
queue-autoscale-queue
заполнилась 100 сообщениями (дашборд Message Queue, графики Sent messages, count и Messages in queue, count). - ВМ из группы
queue-autoscale-ig
стали получать сообщения (график Received messages, count) и удалять их из очереди (графики Deleted messages, count и Messages in queue, count). - По мере обработки сообщений группа ВМ увеличилась с одной до пяти машин, а по окончании обработки — стала пустой (дашборд Compute — Instance Groups, график Number of instances in zone B).
- Очередь
Удалите созданные ресурсы
Чтобы остановить работу инфраструктуры и перестать платить за созданные ресурсы: