Автоматическое масштабирование группы виртуальных машин для обработки сообщений из очереди 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-dв зонеru-central1-d:-
В списке сетей выберите
queue-autoscale-network. -
Нажмите кнопку
Создать подсеть. -
Укажите параметры подсети:
- Имя —
queue-autoscale-subnet-d. - Зона доступности —
ru-central1-d. - 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-dв зонеru-central1-d:yc vpc subnet create queue-autoscale-subnet-d \ --network-name queue-autoscale-network --range 192.168.1.0/24 --zone ru-central1-dГде:
--network-name— имя сети, в которой создается подсеть:queue-autoscale-network.--range— CIDR подсети.--zone— зона доступности, в которой создается подсеть:ru-central1-d.
Результат:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:29:12.450858436Z" name: queue-autoscale-subnet-d network_id: enpabce123hd******** zone_id: ru-central1-d 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-dв зонеru-central1-dс 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-d.Как узнать идентификатор подсети
Консоль управленияCLIAPI- В консоли управления
выберите каталогexample-folder. - В списке сервисов выберите Virtual Private Cloud.
- Перейдите на вкладку
Подсети. - В списке подсетей найдите
queue-autoscale-subnet-dи скопируйте ее Идентификатор.
Выполните следующую команду:
yc vpc subnet get queue-autoscale-subnet-dРезультат:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2021-10-04T16:29:12.450858436Z" name: queue-autoscale-subnet-d network_id: enpabce123hd******** zone_id: ru-central1-d 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-d. -
В блоке Шаблон виртуальной машины нажмите Задать и в открывшемся окне:
-
В блоке Образ загрузочного диска перейдите на вкладку Пользовательский и нажмите Выбрать.
-
В открывшемся окне выберите созданный образ в качестве загрузочного диска:
- Перейдите на вкладку Образ.
- Выберите образ, имя которого начинается на
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-d.Как узнать идентификатор сети
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-d.Как узнать идентификатор сети
Консоль управления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).
- Очередь
Удалите созданные ресурсы
Чтобы остановить работу инфраструктуры и перестать платить за созданные ресурсы: