Автоматическое масштабирование группы виртуальных машин для обработки сообщений из очереди Yandex Message Queue
Сценарий описывает интеграцию между сервисами Yandex Compute Cloud, Yandex Message Queue и Yandex Monitoring.
В сценарии создается группа виртуальных машин. Все ВМ в группе обрабатывают сообщения из одной очереди Message Queue (для примера — получают их и через некоторое время удаляют). Количество сообщений в очереди записывается в метрику Yandex Monitoring, и группа ВМ автоматически масштабируется по этой метрике.
Для масштабирования выбрана деликатная стратегия остановки: ВМ останавливаются самостоятельно после обработки всех сообщений и только после этого удаляются из группы при уменьшении ее размера. Это гарантирует, что ВМ не будут удалены принудительно и обработают последние сообщения, даже если очередь опустеет до конца обработки.
Чтобы выполнить сценарий:
- Подготовьте окружение.
- Создайте очередь в Message Queue.
- Создайте образ с приложением.
- Создайте группу виртуальных машин.
- Проверьте масштабирование группы виртуальных машин.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.
Подробнее об облаках и каталогах.
В качестве примера в сценарии будет использоваться каталог с именем example-folder
.
Необходимые платные ресурсы
В стоимость инфраструктуры входят:
- плата за использование виртуальных машин и хранение образа (см. тарифы Compute Cloud);
- плата за использование публичных IP-адресов и исходящий трафик с ВМ (см. тарифы Virtual Private Cloud);
- плата за запросы к очереди (см. тарифы Message Queue).
Подготовьте окружение
Создайте вспомогательные ресурсы Yandex Cloud
-
Создайте сервисный аккаунт
queue-autoscale-sa
и назначьте ему рольeditor
в каталогеexample-folder
:- В консоли управления выберите каталог
example-folder
. - Перейдите на вкладку Сервисные аккаунты и нажмите кнопку Создать сервисный аккаунт.
- Укажите Имя сервисного аккаунта:
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: aje6brh817ro8o6vo6tv folder_id: b0g12ga82bcv0cdeferg 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: ajevb6bx51w3wnep9clq service_account_id: aje6brh817ro8o6vo6tv created_at: "2021-10-04T16:25:19.143847764Z" description: Message Queue key_id: g3VybpVKdq_YiFEmDIht secret: WVUqnwmC4LSUep0GTKGkbcht9K3Xav7VSOeD_mRG
-
Создайте облачную сеть
queue-autoscale-network
:yc vpc network create queue-autoscale-network
Результат:
id: enpabce123hde4ft1r3t folder_id: b0g12ga82bcv0cdeferg 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: e1lnabc23r1c9d0efoje folder_id: b0g12ga82bcv0cdeferg created_at: "2021-10-04T16:29:12.450858436Z" name: queue-autoscale-subnet-a network_id: enpabce123hde4ft1r3t 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/b1gvlrnlei4l5idm9cbj/dj6000000003n58805qi/queue-autoscale-queue
-
Создайте очередь
queue-autoscale-queue
с помощью метода API CreateQueue. В ответных данных будет указан URL очереди. -
Вставьте URL очереди в файл
queue
в следующем формате:QueueUrl: <URL очереди>
Создайте образ с приложением
-
Если у вас еще не установлен Packer, скачайте и установите его по инструкции на официальном сайте.
Примечание
Для работы с Yandex Cloud требуется Packer версии не ниже 1.5.
-
Скачайте архив с файлами для образа (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
. - Перейдите на вкладку Сервисные аккаунты.
- В списке сервисных аккаунтов выберите
queue-autoscale-sa
. - Скопируйте Идентификатор сервисного аккаунта.
Выполните следующую команду:
yc iam service-account get queue-autoscale-sa
Результат:
id: aje6brh817ro8o6vo6tv folder_id: b0g12ga82bcv0cdeferg created_at: "2021-10-04T16:19:10.153346507Z" name: queue-autoscale-sa
Используйте вызов gRPC API ServiceAccountService/List или метод REST API list.
- В консоли управления выберите каталог
-
В поле
folder_id
укажите идентификатор каталога в Yandex Cloud.Как узнать идентификатор каталогаКонсоль управленияCLIAPIВ консоли управления найдите каталог
example-folder
в списке и скопируйте его Идентификатор.Выполните следующую команду:
yc resource-manager folder get example-folder
Результат:
id: b1g9hv2loamqfnbul7d9 cloud_id: b1g2y61sxwqxrtw34qtq created_at: "2021-10-04T13:21:32.788067492Z" name: example-folder status: ACTIVE
Используйте вызов gRPC API FolderService/List или метод REST API 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: e1lnabc23r1c9d0efoje folder_id: b0g12ga82bcv0cdeferg created_at: "2021-10-04T16:29:12.450858436Z" name: queue-autoscale-subnet-a network_id: enpabce123hde4ft1r3t zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
Используйте вызов gRPC API SubnetService/List или метод REST API list.
- В консоли управления выберите каталог
-
-
Получите IAM-токен для работы сервисного аккаунта с Compute Cloud и сохраните его в файл
key.json
:CLIyc 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: ajevh3a0hrqf65scefug service_account_id: aje6brh817ro8o6vo6tv created_at: "2021-10-04T16:35:19.057777570Z" description: Compute Cloud key_algorithm: RSA_2048
-
Выполните команду для создания образа:
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: fd8hlbuhjc4mssrvknkv) 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-subnet-a
будет выбрана автоматически. - В поле Публичный адрес выберите Автоматически, чтобы ВМ имели доступ в интернет и могли получать сообщения из очереди.
- Выберите Сеть
-
В блоке Доступ:
- Выберите Сервисный аккаунт
queue-autoscale-sa
. - Укажите логин и содержимое открытого ключа для подключения к ВМ.
- Выберите Сервисный аккаунт
-
Нажмите кнопку Сохранить.
-
-
В блоке В процессе создания и обновления разрешено укажите следующие значения:
- Одновременно останавливать —
1
. - Останавливать машины по стратегии — Деликатная.
- Одновременно останавливать —
-
В блоке Масштабирование укажите следующие значения:
- Тип — Автоматический.
- Тип автомасштабирования — Региональное.
- Минимальное количество ВМ в зоне — 0.
- Максимальный размер группы — 5.
- Промежуток измерения нагрузки — 60 секунд.
- Время на разогрев ВМ — 0 минут.
- Период стабилизации — 5 минут.
- Начальный размер группы — 1.
-
В блоке Метрики укажите следующие значения:
- Метрика — Пользовательская.
- Идентификатор сервиса —
message-queue
. - Имя метрики —
queue.messages.stored_count
. - Метки — ключ
queue
, значениеqueue-autoscale-queue
. - Тип метрики —
GAUGE
. - Тип правила —
WORKLOAD
. - Целевое значение — 5.
-
Нажмите кнопку Создать.
-
Получите идентификатор образа, созданного ранее:
yc compute image get-latest-from-family queue-autoscale-image
Результат:
id: fd8hlbuhjc4mssrvknkv folder_id: b0g12ga82bcv0cdeferg 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: - f2e6fnj3erf1sropamjr 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
Выполните команду:
yc vpc network get queue-autoscale-network
Результат:
id: enpabce123hde4ft1r3t folder_id: b0g12ga82bcv0cdeferg created_at: "2021-10-04T16:28:15.905337847Z" name: queue-autoscale-network
-
Консоль управления
- В консоли управления выберите каталог
example-folder
. - В списке сервисов выберите Virtual Private Cloud.
- В списке сетей найдите
queue-autoscale-network
и скопируйте ее Идентификатор.
- В консоли управления выберите каталог
-
API
Используйте вызов gRPC API NetworkService/List или метод REST API 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
.Как узнать идентификатор сети-
API
Используйте вызов gRPC API NetworkService/List или метод REST API list.
-
Консоль управления
- В консоли управления выберите каталог
example-folder
. - В списке сервисов выберите Virtual Private Cloud.
- В списке сетей найдите
queue-autoscale-network
и скопируйте ее Идентификатор.
- В консоли управления выберите каталог
-
CLI
Выполните следующую команду:
yc vpc network get queue-autoscale-network
Результат:
id: enpabce123hde4ft1r3t folder_id: b0g12ga82bcv0cdeferg created_at: "2021-10-04T16:28:15.905337847Z" name: queue-autoscale-network
-
-
В поле
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:
Консоль управления-
Откройте дашборд с информацией о группе ВМ:
- В Yandex Monitoring выберите сервисный дашборд Compute — Instance Groups.
- В поле Instance Group ID выберите
queue-autoscale-ig
.
-
Откройте дашборд с информацией об очереди:
- В Yandex Monitoring выберите сервисный дашборд Message Queue.
- В поле Queue ID выберите
queue-autoscale-queue
.
-
-
По данным дашбордов убедитесь, что последовательно произошли следующие события:
- Очередь
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).
- Очередь
Удалите созданные ресурсы
Чтобы остановить работу инфраструктуры и перестать платить за созданные ресурсы: