Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Практические руководства
  • Веб-сервис
    • Все руководства
    • Статический сайт в Object Storage
    • Сайт на LAMP- или LEMP-стеке
    • Отказоустойчивый сайт с балансировкой нагрузки через Network Load Balancer
    • Отказоустойчивый сайт с балансировкой нагрузки через Application Load Balancer
    • Сайт на базе Joomla с БД PostgreSQL
    • Сайт на WordPress
    • Сайт на WordPress с БД MySQL
    • Перенос WordPress сайта с хостинга в Yandex Cloud
    • Веб-сайт на базе 1С-Битрикс
    • Организация виртуального хостинга
    • Создание балансировщика с защитой от DDoS
    • Публикация обновлений для игр
    • Интеграция L7-балансировщика с Cloud CDN и Object Storage
    • Сине-зеленое и канареечное развертывание версий сервиса
    • Терминирование TLS-соединений
  • Интернет-магазины
    • Все руководства
    • Интернет-магазин на 1С-Битрикс
    • Интернет-магазин на Opencart
  • Архив данных
    • Все руководства
    • Однонодовый файловый сервер
    • Настройка SFTP-сервера на Centos 7
    • Резервное копирование в Object Storage через Acronis
    • Резервное копирование в Object Storage с помощью CloudBerry Desktop Backup
    • Резервное копирование в Object Storage через Duplicati
    • Резервное копирование в Object Storage с помощью Bacula
    • Резервное копирование в Object Storage с помощью Veritas Backup Exec
    • Распознавание архива изображений в Yandex Vision
  • Тестовая среда
    • Все руководства
    • Тестирование приложений с помощью GitLab
    • Создание тестовых ВМ через GitLab CI
    • Высокопроизводительные вычисления на прерываемых виртуальных машинах
    • Эмуляция множества IoT-устройств
    • Нагрузочное тестирование gRPC-сервиса
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
    • HTTPS-тест с постоянной нагрузкой с помощью Phantom
    • HTTPS-тест со ступенчатой нагрузкой с помощью Pandora
    • Нагрузочное тестирование с нескольких агентов
  • Управление инфраструктурой
    • Все руководства
    • Начало работы с Terraform
    • Загрузка состояний Terraform в Object Storage
    • Начало работы с Packer
    • Сборка образа ВМ с набором инфраструктурных инструментов с помощью Packer
    • Автоматизация сборки образов ВМ с помощью Jenkins
    • Непрерывное развертывание контейнеризованных приложений с помощью GitLab
    • Создание кластера Linux-серверов «1С:Предприятия» с кластером Managed Service for PostgreSQL
    • Миграция в Yandex Cloud с помощью Hystax Acura
    • Защита от сбоев с помощью Hystax Acura
    • Настройка синхронизации времени NTP
    • Работа с группой ВМ с автоматическим масштабированием
    • Автомасштабирование группы ВМ по расписанию
    • Автомасштабирование группы ВМ для обработки сообщений из очереди
    • Обновление группы ВМ под нагрузкой
    • Передача логов с ВМ в Yandex Cloud Logging
    • Резервное копирование ВМ с помощью Hystax Acura Backup
    • Настройка отказоустойчивой архитектуры в Yandex Cloud
    • Создание SAP-программы в Yandex Cloud
    • Настройка локального кеширующего DNS-резолвера
    • Миграция DNS-зон из Яндекс 360
    • Интеграция с корпоративным сервисом DNS
    • Создание веб-хука резолвера ACME для ответов на DNS01-проверки
    • Запись логов балансировщика в PostgreSQL
    • Создание триггера для бюджетов, который вызывает функцию для остановки ВМ
  • Построение Data Platform
    • Все руководства
    • Миграция базы данных из стороннего кластера Apache Kafka® в Yandex Managed Service for Apache Kafka®
    • Поставка данных из Yandex Managed Service for MySQL в Yandex Managed Service for Apache Kafka® с помощью Yandex Data Transfer
    • Поставка данных из Yandex Managed Service for PostgreSQL в Yandex Managed Service for Apache Kafka® с помощью Yandex Data Transfer
    • Поставка данных из Yandex Managed Service for Apache Kafka® в Yandex Managed Service for ClickHouse с помощью Yandex Data Transfer
    • Перенос данных между кластерами Yandex Managed Service for Apache Kafka® с помощью Yandex Data Transfer
    • Поставка данных из Yandex Managed Service for Apache Kafka® в Yandex Managed Service for YDB с помощью Yandex Data Transfer
    • Поставка данных из Yandex Managed Service for MySQL в Yandex Managed Service for Apache Kafka® с помощью Debezium
    • Поставка данных из Yandex Managed Service for PostgreSQL в Yandex Managed Service for Apache Kafka® с помощью Debezium
    • Настройка Kafka Connect для работы с кластером Yandex Managed Service for Apache Kafka®
    • Управление схемами данных в Yandex Managed Service for Apache Kafka®
    • Использование Managed Schema Registry с Yandex Managed Service for Apache Kafka®
    • Использование Confluent Schema Registry с Yandex Managed Service for Apache Kafka®
    • Миграция базы данных из MySQL в ClickHouse с помощью Yandex Data Transfer
    • Асинхронная репликация данных из PostgreSQL в ClickHouse
    • Обмен данными между Yandex Managed Service for ClickHouse и Yandex Data Proc
    • Настройка Yandex Managed Service for ClickHouse для Graphite
    • Получение данных из Yandex Managed Service for Apache Kafka® в Yandex Managed Service for ClickHouse
    • Получение данных из RabbitMQ в Yandex Managed Service for ClickHouse
    • Сохранение потока данных Yandex Data Streams в Yandex Managed Service for ClickHouse
    • Использование гибридного хранилища в Yandex Managed Service for ClickHouse
    • Шардирование таблиц Yandex Managed Service for ClickHouse
    • Настройка Yandex Cloud DNS для доступа к кластерам управляемых баз данных из других облачных сетей
    • Настройка Yandex Cloud DNS для доступа к кластеру Yandex Managed Service for ClickHouse из других облачных сетей
    • Импорт данных из Yandex Managed Service for MySQL в Yandex Data Proc с помощью Sqoop
    • Импорт данных из Yandex Managed Service for PostgreSQL в Yandex Data Proc с помощью Sqoop
    • Использование скриптов инициализации для настройки GeeseFS в Yandex Data Proc
    • Миграция данных из стороннего кластера Elasticsearch в Yandex Managed Service for Elasticsearch с помощью Reindex API
    • Миграция коллекций из стороннего кластера MongoDB в Yandex Managed Service for MongoDB
    • Миграция данных в Yandex Managed Service for MongoDB
    • Шардирование коллекций MongoDB
    • Анализ производительности и оптимизация MongoDB
    • Миграция базы данных из стороннего кластера MySQL в кластер Yandex Managed Service for MySQL
    • Анализ производительности и оптимизация Managed Service for MySQL
    • Синхронизация данных из стороннего кластера MySQL в Yandex Managed Service for MySQL с помощью Yandex Data Transfer
    • Миграция базы данных из Yandex Managed Service for MySQL в сторонний кластер MySQL
    • Миграция базы данных из Yandex Managed Service for MySQL в Yandex Managed Service for YDB с помощью Yandex Data Transfer
    • Миграция базы данных из Yandex Managed Service for MySQL в Yandex Object Storage с помощью Yandex Data Transfer
    • Создание кластера PostgreSQL для 1С
    • Анализ производительности и оптимизация Managed Service for PostgreSQL
    • Миграция базы данных из стороннего кластера PostgreSQL в кластер Yandex Managed Service for PostgreSQL
    • Миграция базы данных из Managed Service for PostgreSQL
    • Поставка данных из Yandex Managed Service for PostgreSQL в Yandex Managed Service for YDB с помощью Yandex Data Transfer
    • Миграция базы данных из Yandex Managed Service for PostgreSQL в Yandex Object Storage
    • Миграция базы данных из Greenplum® в ClickHouse
    • Миграция базы данных из Greenplum® в PostgreSQL
    • Миграция базы данных из стороннего кластера Redis в Yandex Managed Service for Redis
    • Использование кластера Managed Service for Redis в качестве хранилища сессий PHP
  • Продукты Microsoft в Yandex Cloud
    • Все руководства
    • Развертывание Active Directory
    • Развертывание Microsoft Exchange
    • Развертывание Remote Desktop Services
    • Развертывание группы доступности Always On с внутренним сетевым балансировщиком
    • Развертывание Remote Desktop Gateway
  • Сетевая инфраструктура
    • Все руководства
    • Архитектура и защита базового интернет-сервиса
    • Настройки DHCP для работы с корпоративным DNS-сервером
    • Маршрутизация с помощью NAT-инстанса
    • Создание туннеля IPSec VPN
    • Установка виртуального роутера Cisco CSR 1000v
    • Установка виртуального роутера Mikrotik CHR
    • Соединение с облачной сетью при помощи OpenVPN
    • Создание и настройка шлюза UserGate в режиме прокси-сервера
    • Создание и настройка шлюза UserGate в режиме межсетевого экрана
    • Настройка сети для Yandex Data Proc
  • Визуализация и анализ данных
    • Все руководства
    • Визуализация данных из CSV-файла
    • Создание и публикация диаграммы с картой Москвы из CSV-файла
    • Анализ продаж сети магазинов из БД ClickHouse
    • Анализ открытых данных ДТП на дорогах России
    • Анализ продаж и локаций пиццерий на данных из БД ClickHouse и Marketplace
    • Веб-аналитика с подключением к Яндекс Метрике
    • Веб-аналитика с расчетом воронок и когорт на данных Яндекс Метрики
    • Аналитика мобильного приложения на данных AppMetrica
    • Анализ статистики подкастов Яндекс Музыки (для авторов подкастов)
    • Визуализация данных с помощью SQL-чарта
    • Анализ customer journey мобильного приложения на данных AppMetrica
    • Анализ логов Object Storage при помощи DataLens
  • Интернет вещей
    • Руководства по работе с интернетом вещей
    • Мониторинг состояния географически распределенных устройств
    • Мониторинг показаний датчиков и уведомления о событиях
  • Бессерверные технологии
    • Сокращатель ссылок
    • Ввод данных в системы хранения
    • Хранение журналов работы приложения
    • Развертывание веб-приложения с использованием Java Servlet API
    • Разработка Slack-бота
    • Разработка Telegram-бота
    • Разработка пользовательской интеграции в API Gateway
    • Разработка CRUD API для сервиса фильмов
    • Разработка навыка Алисы и сайта с авторизацией
  1. Управление инфраструктурой
  2. Автомасштабирование группы ВМ по расписанию

Масштабирование группы виртуальных машин по расписанию

Статья создана
Yandex Cloud
,
улучшена
mishich666
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
  • Создайте вспомогательные ресурсы
    • Создайте сервисный аккаунт
    • Создайте облачную сеть
  • Создайте группу виртуальных машин
  • Создайте ресурсы Cloud Functions
    • Создайте функцию
    • Создайте триггер
  • Проверьте масштабирование группы ВМ
  • Как удалить созданные ресурсы
  • Как создать инфраструктуру с помощью Terraform

Создайте группу виртуальных машин Yandex Compute Cloud и настройте для нее масштабирование по расписанию. Размером группы ВМ будет управлять функция Yandex Cloud Functions, запускаемая по таймеру.

Чтобы настроить масштабирование группы ВМ с помощью штатных инструментов — через консоль управления, с помощью интерфейса командной строки (CLI) или API:

  1. Подготовьте облако к работе.
  2. Создайте вспомогательные ресурсы.
  3. Создайте группу виртуальных машин.
  4. Создайте ресурсы Cloud Functions.
  5. Проверьте масштабирование группы ВМ.

Если созданные ресурсы вам больше не нужны, удалите их.

Также инфраструктуру для масштабирования группы ВМ можно развернуть через Terraform с помощью готового файла конфигурации.

Подготовьте облако к работе

Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
  2. На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.

Подробнее об облаках и каталогах.

В качестве примера будет использоваться каталог с именем example-folder.

Необходимые платные ресурсы

В стоимость инфраструктуры входят:

  • использование виртуальных машин (см. тарифы Compute Cloud);
  • вызовы функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).

Создайте вспомогательные ресурсы

Создайте сервисный аккаунт

Сервисный аккаунт будет привязан к группе ВМ Compute Cloud и функции Cloud Functions.

Консоль управления
CLI
Terraform
API
  1. В консоли управления выберите каталог example-folder.

  2. Выберите вкладку Сервисные аккаунты.

  3. Нажмите кнопку Создать сервисный аккаунт.

  4. Введите Имя vm-scale-scheduled-sa.

  5. В поле Роли в каталоге добавьте следующие роли:

    • compute.admin — для управления группой ВМ.
    • iam.serviceAccounts.user — для привязки сервисного аккаунта к ВМ, входящим в группу.
    • serverless.functions.invoker — для запуска функции Cloud Functions.
  6. Нажмите кнопку Создать.

  1. Создайте сервисный аккаунт:

    yc iam service-account create --name vm-scale-scheduled-sa \
      --folder-name example-folder
    

    Результат:

    id: ajeab0cnib1pdefe21dm
    folder_id: b0g12ga82bcv0cdeferg
    created_at: "2022-03-15T09:44:35.989446Z"
    name: vm-scale-scheduled-sa
    

    Подробнее о команде yc iam service-account create см. в справочнике CLI.

  2. Назначьте сервисному аккаунту роли:

    • 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
      
    • serverless.functions.invoker — для запуска функции Cloud Functions:

      yc resource-manager folder add-access-binding example-folder \
        --service-account-name vm-scale-scheduled-sa \
        --role serverless.functions.invoker \
        --folder-name example-folder
      

    Подробнее о команде yc resource-manager folder add-access-binding см. в справочнике CLI.

См. раздел Как создать инфраструктуру с помощью Terraform.

Воспользуйтесь методами:

  1. create для ресурса ServiceAccount, чтобы создать сервисный аккаунт vm-scale-scheduled-sa;

  2. setAccessBindings для ресурса Folder, чтобы назначить сервисному аккаунту в текущем каталоге роли:

    • compute.admin — для управления группой ВМ.
    • iam.serviceAccounts.user — для привязки сервисного аккаунта к ВМ, входящим в группу.
    • serverless.functions.invoker — для запуска функции Cloud Functions.

Создайте облачную сеть

Группа ВМ будет размещена в облачной сети Yandex Virtual Private Cloud и ее подсетях.

Консоль управления
CLI
Terraform
API
  1. В консоли управления выберите каталог example-folder.
  2. В списке сервисов выберите Virtual Private Cloud.
  3. Нажмите кнопку Создать сеть.
  4. Введите Имя vm-scale-scheduled-network.
  5. Выберите дополнительную опцию Создать подсети.
  6. Нажмите кнопку Создать сеть.
  1. Создайте сеть vm-scale-scheduled-network:

    yc vpc network create --name vm-scale-scheduled-network \
      --folder-name example-folder
    

    Результат:

    id: enpabce123hde4ft1r3t
    folder_id: b0g12ga82bcv0cdeferg
    created_at: "2022-03-15T09:55:50.004472Z"
    name: vm-scale-scheduled-network
    

    Подробнее о команде yc vpc network create см. в справочнике CLI.

  2. Создайте подсеть 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: e1lnabc23r1c9d0efoje
    folder_id: b0g12ga82bcv0cdeferg
    created_at: "2022-03-15T09:56:51.859345Z"
    name: vm-scale-scheduled-subnet-a
    network_id: enpabce123hde4ft1r3t
    zone_id: ru-central1-a
    v4_cidr_blocks:
    - 192.168.1.0/24
    

    Подробнее о команде yc vpc subnet create см. в справочнике CLI.

  3. Создайте подсеть 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: b1csa2b3clideftjb121
    folder_id: b0g12ga82bcv0cdeferg
    created_at: "2022-03-15T09:57:48.934429Z"
    name: vm-scale-scheduled-subnet-b
    network_id: enpabce123hde4ft1r3t
    zone_id: ru-central1-b
    v4_cidr_blocks:
    - 192.168.2.0/24
    

См. раздел Как создать инфраструктуру с помощью Terraform.

  1. Создайте сеть vm-scale-scheduled-network с помощью метода create для ресурса Network.

  2. Создайте подсети vm-scale-scheduled-subnet-a в зоне ru-central1-a и vm-scale-scheduled-subnet-b в зоне ru-central1-b с помощью метода create для ресурса Subnet.

Создайте группу виртуальных машин

Группа ВМ будет создана с ручным масштабированием, чтобы ее размером могла управлять функция Cloud Functions.

Консоль управления
CLI
Terraform
API
  1. В консоли управления выберите каталог example-folder.

  2. Выберите сервис Compute Cloud.

  3. На панели слева выберите Группы виртуальных машин.

  4. Нажмите кнопку Создать группу.

  5. В блоке Базовые параметры:

    • Введите Имя группы vm-scale-scheduled-ig.
    • Выберите Сервисный аккаунт vm-scale-scheduled-sa.
  6. В блоке Распределение выберите Зоны доступности ru-central1-a и ru-central1-b.

  7. В блоке Шаблон виртуальной машины нажмите кнопку Задать:

    • В блоке Выбор образа/загрузочного диска на вкладке Операционные системы выберите Ubuntu 20.04.

    • В блоке Вычислительные ресурсы укажите следующие настройки:

      • Платформа — Intel Ice Lake.
      • vCPU — 2.
      • Гарантированная доля vCPU — 20%.
      • RAM — 2 ГБ.
    • В блоке Сетевые настройки

      • Выберите Сеть vm-scale-scheduled-network.
      • В поле Публичный адрес выберите Без адреса.
    • В блоке Доступ:

      • Выберите Сервисный аккаунт vm-scale-scheduled-sa.
      • В поле Логин укажите имя пользователя, который будет создан на ВМ. Придумайте имя самостоятельно.
      • В поле SSH-ключ вставьте содержимое файла открытого ключа SSH. Создать пару ключей можно по инструкции.
    • Нажмите кнопку Сохранить.

  8. В блоке В процессе создания и обновления разрешено укажите следующие настройки:

    • Добавлять выше целевого значения — 2.
    • Уменьшать относительно целевого значения — 2.
    • Одновременно создавать — 2.
    • Одновременно останавливать — 2.
  9. В блоке Масштабирование:

    • Выберите Тип Фиксированный.
    • Введите Размер 2.
  10. Нажмите кнопку Создать.

  1. Получите идентификаторы ресурсов, созданных ранее:

    • Идентификатор сервисного аккаунта vm-scale-scheduled-sa:

      yc iam service-account get vm-scale-scheduled-sa \
        --folder-name example-folder | grep "^id"
      

      Результат:

      id: ajeab0cnib1pdefe21dm
      

      Подробнее о команде 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: enpabce123hde4ft1r3t
      

      Подробнее о команде 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: e1lnabc23r1c9d0efoje
      

      Подробнее о команде 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: b1csa2b3clideftjb121
      

      Подробнее о команде yc vpc subnet get см. в справочнике CLI.

  2. Получите идентификатор последней версии публичного образа Ubuntu 20.04 LTS:

    yc compute image get-latest-from-family ubuntu-2004-lts \
      --folder-id standard-images | grep "^id"
    

    Результат:

    id: fd83n3uou8m03iq9gavu
    

    Подробнее о команде yc compute image get-latest-from-family см. в справочнике CLI.

  3. Вставьте полученные идентификаторы в файл 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
    
  4. Создайте группу ВМ с именем vm-scale-scheduled-ig по спецификации specification.yaml:

    yc compute instance-group create --file specification.yaml \
      --folder-name example-folder
    

    Результат:

    done (2m18s)
    id: cl0kabcquk1gomdefbkk
    folder_id: b0g12ga82bcv0cdeferg
    ...
    service_account_id: ajeab0cnib1pdefe21dm
    status: ACTIVE
    

См. раздел Как создать инфраструктуру с помощью Terraform.

  1. Получите идентификаторы ресурсов, созданных ранее:

    • Идентификатор сервисного аккаунта vm-scale-scheduled-sa — с помощью вызова gRPC API ServiceAccountService/Get или метода REST API get.
    • Идентификатор сети vm-scale-scheduled-network — с помощью вызова gRPC API NetworkService/Get или метода REST API get.
    • Идентификаторы подсетей vm-scale-scheduled-subnet-a и vm-scale-scheduled-subnet-b — с помощью вызовов gRPC API SubnetService/Get или метода REST API get.
  2. Получите идентификатор последней версии публичного образа ubuntu-2004-lts в семействе standard-images с помощью вызова gRPC API ImageService/GetLatestByFamily или метода REST API getLatestByFamily.

  3. Вставьте полученные идентификаторы в файл 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
    
  4. Создайте группу ВМ с именем vm-scale-scheduled-ig по спецификации specification.yaml с помощью вызова gRPC API InstanceGroupService/CreateFromYaml или метода REST API createFromYaml.

Создайте ресурсы Cloud Functions

Создайте функцию

Функция будет содержать код с командами CLI Yandex Cloud, которые изменяют группу ВМ.

Консоль управления
CLI
Terraform
API
  1. В консоли управления выберите каталог example-folder.

  2. Выберите сервис Cloud Functions.

  3. Нажмите кнопку Создать функцию.

  4. Введите Имя vm-scale-scheduled-function.

  5. Нажмите кнопку Создать.

  6. Выберите среду выполнения Bash.

  7. Включите опцию Добавить файлы с примерами кода.

  8. Нажмите кнопку Продолжить.

  9. В блоке Редактор выберите файл handler.sh.

  10. Вставьте вместо содержимого файла следующий код:

    # 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
    
  11. В блоке Параметры:

    • В поле Таймаут, с укажите значение 60.

    • В поле Сервисный аккаунт выберите vm-scale-scheduled-sa.

    • В поле Переменные окружения добавьте следующие переменные:

      • IG_NAME = vm-scale-scheduled-ig.
      • IG_BASE_SIZE = 2.
      • FOLDER_ID = идентификатор каталога. Получить идентификатор можно по инструкции.
  12. В правом верхнем углу нажмите кнопку Создать версию.

  1. Создайте файл 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
    
  2. Создайте функцию:

    yc serverless function create vm-scale-scheduled-function \
      --folder-name example-folder
    

    Результат:

    done (1s)
    id: d4e7d67ikvmqk5uoim47
    folder_id: b1g9hv2loamqfnbul7d9
    created_at: "2022-04-01T13:48:27.705Z"
    name: vm-scale-scheduled-function
    log_group_id: ckgij6l0845hsdc9khiq
    http_invoke_url: https://functions.yandexcloud.net/d4e7d67ikvmqk5uoim47
    status: ACTIVE
    
  3. Создайте версию функции:

    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: d4efmv9n3qf1ptjtlof3
    function_id: d4e7d67ikvmqk5uoim47
    created_at: "2022-04-01T14:04:29.523Z"
    runtime: bash
    entrypoint: handler.sh
    resources:
    memory: "134217728"
    execution_timeout: 60s
    service_account_id: aje9s4pud13hfhk1bfgn
    image_size: "4096"
    status: ACTIVE
    tags:
    - $latest
    log_group_id: ckgij6l0845hsdc9khiq
    environment:
      FOLDER_ID: b1g9hv2loamqfnbul7d9
      IG_BASE_SIZE: "2"
      IG_NAME: vm-scale-scheduled-ig
    

См. раздел Как создать инфраструктуру с помощью Terraform.

  1. Создайте функцию vm-scale-scheduled-function с помощью вызова gRPC API FunctionService/Create или метода REST API create. Из ответных данных получите идентификатор созданной функции.

  2. Создайте версию функции с помощью вызова gRPC API FunctionService/CreateVersion или метода REST API 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
    

Создайте триггер

Триггер определяет условия запуска функции. Для запуска по расписанию используется триггер-таймер.

Консоль управления
CLI
Terraform
API
  1. В консоли управления выберите каталог example-folder.

  2. Выберите сервис Cloud Functions.

  3. На панели слева выберите Триггеры.

  4. Нажмите кнопку Создать триггер.

  5. В блоке Базовые параметры:

    • Введите Имя vm-scale-scheduled-trigger.
    • Выберите Тип Таймер.
    • В поле Запускаемый ресурс выберите Функция.
  6. В блоке Настройки таймера укажите Cron-выражение */2 * * * ? * — триггер будет срабатывать каждые две минуты, например в 09:58, 10:00, 10:02, 10:04 и т. д.

  7. В блоке Настройки функции:

    • Выберите Функцию vm-scale-scheduled-function.
    • Выберите Тег версии функции $latest.
    • Выберите Сервисный аккаунт vm-scale-scheduled-sa.
  8. В блоке Настройки Dead Letter Queue очистите поле Сервисный аккаунт (Не выбрано).

  9. Нажмите кнопку Создать триггер.

Выполните следующую команду:

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: a1s22pb0v5i4q432hi0p
folder_id: b1g9hv2loamqfnbul7d9
created_at: "2022-04-06T14:56:54.253709098Z"
name: vm-scale-scheduled-trigger
rule:
  timer:
    cron_expression: "*/2 * * * ? *"
    invoke_function_with_retry:
      function_id: d4e7d67ikvmqk5uoim47
      function_tag: $latest
      service_account_id: aje9s4pud13hfhk1bfgn
status: ACTIVE

См. раздел Как создать инфраструктуру с помощью Terraform.

Используйте вызов gRPC API TriggerService/Create или метод REST API create, чтобы создать триггер типа timer с cron-выражением */2 * * * ? *, связанный с функцией vm-scale-scheduled-function версии $latest и сервисным аккаунтом vm-scale-scheduled-sa.

Проверьте масштабирование группы ВМ

Консоль управления
CLI
API
  1. В консоли управления выберите каталог example-folder.
  2. Выберите сервис Compute Cloud.
  3. На панели слева выберите Группы виртуальных машин.
  4. Выберите группу vm-scale-scheduled-ig.
  5. Убедитесь, что в блоке Состояния виртуальных машин каждые две минуты изменяется количество ВМ: увеличивается с 2 до 3, затем уменьшается с 3 до 2 и т. д. Также вы можете проверить обновление группы на вкладке Операции.

Несколько раз выполните следующую команду:

yc compute instance-group get vm-scale-scheduled-ig \
  --folder-name example-folder

Результат:

id: cl1l0ljqbmkp8k1f902l
folder_id: b1g9hv2loamqfnbul7d9
created_at: "2022-03-28T13:24:20.693Z"
name: vm-scale-scheduled-ig
...
managed_instances_state:
  target_size: "2"
  running_actual_count: "2"
...

Значение в поле target_size (целевой размер группы) должно меняться с 2 на 3 и обратно.

Несколько раз получите информацию о группе ВМ vm-scale-scheduled-ig с помощью вызова gRPC API InstanceGroupService/Get или метода REST API get. Значение в поле target_size (целевой размер группы) должно меняться с 2 на 3 и обратно.

Как удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  1. Удалите триггер vm-scale-scheduled-trigger.
  2. Удалите функцию vm-scale-scheduled-function.
  3. Удалите группу ВМ vm-scale-scheduled-ig.

Как создать инфраструктуру с помощью Terraform

Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). Terraform и его провайдеры распространяются под лицензией Mozilla Public License.

Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform или в зеркале.

При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.

Чтобы настроить масштабирование группы ВМ с помощью Terraform:

  1. Установите Terraform и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).

  2. Подготовьте файлы с описанием инфраструктуры:

    Готовый архив
    Создание вручную
    1. Создайте папку для файлов.
    2. Скачайте архив (2 КБ).
    3. Разархивируйте архив в папку. В результате в ней должны появиться конфигурационный файл vm-scale-scheduled.tf и архив с кодом функции Cloud Functions vm-scale-scheduled-function.zip.
    1. Создайте папку для файлов.

    2. Создайте в папке:

      • Конфигурационный файл 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_binding" "vm-scale-scheduled-sa-role-compute" {
          folder_id = "<идентификатор_каталога>"
          role      = "compute.admin"
          members   = [
            "serviceAccount:${yandex_iam_service_account.vm-scale-scheduled-sa.id}"
          ]
        }
        
        resource "yandex_resourcemanager_folder_iam_binding" "vm-scale-scheduled-sa-role-iam" {
          folder_id = "<идентификатор_каталога>"
          role      = "iam.serviceAccounts.user"
          members   = [
            "serviceAccount:${yandex_iam_service_account.vm-scale-scheduled-sa.id}"
          ]
        }
        
        resource "yandex_resourcemanager_folder_iam_binding" "vm-scale-scheduled-sa-role-functions" {
          folder_id = "<идентификатор_каталога>"
          role      = "serverless.functions.invoker"
          members   = [
            "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_binding.vm-scale-scheduled-sa-role-compute,
            yandex_resourcemanager_folder_iam_binding.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_binding.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_binding.vm-scale-scheduled-sa-role-functions
          ]
        }
        
      • Файл с кодом функции Cloud Functions handler.sh:

        handler.sh

        Важно

        Если вы создаете файл в Windows, убедитесь, что переносы строк имеют формат Unix: \n, а не \r\n. Заменить переносы можно в текстовом редакторе, например Notepad++, или с помощью утилиты dos2unix или Tofrodos.

        # 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
        
    3. Создайте в папке архив vm-scale-scheduled-function.zip, содержащий файл handler.sh. После этого удалите файл handler.sh вне архива.

  3. В файле vm-scale-scheduled.tf вставьте в блок locals следующие значения:

    • token — OAuth-токен (если вы используете аккаунт на Яндексе) или IAM-токен (если вы используете аккаунт на Яндексе или федеративный аккаунт) для доступа к Yandex Cloud. Время жизни IAM-токена — максимум 12 часов, но не больше времени жизни cookie у федерации.
    • cloud_id — идентификатор облака, в котором будут создаваться ресурсы.
    • folder_id — идентификатор каталога, в котором будут создаваться ресурсы.
    • username — имя пользователя, который будет создан на ВМ. Придумайте имя самостоятельно.
    • ssh_key_path — путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ. Создать пару ключей можно по инструкции.
  4. Создайте ресурсы:

    1. В терминале перейдите в папку, где вы отредактировали конфигурационный файл.

    2. Проверьте корректность конфигурационного файла с помощью команды:

      terraform validate
      

      Если конфигурация является корректной, появится сообщение:

      Success! The configuration is valid.
      
    3. Выполните команду:

      terraform plan
      

      В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.

    4. Примените изменения конфигурации:

      terraform apply
      
    5. Подтвердите изменения: введите в терминале слово yes и нажмите Enter.

  5. Проверьте масштабирование группы ВМ.

Была ли статья полезна?

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Создайте вспомогательные ресурсы
  • Создайте сервисный аккаунт
  • Создайте облачную сеть
  • Создайте группу виртуальных машин
  • Создайте ресурсы Cloud Functions
  • Создайте функцию
  • Создайте триггер
  • Проверьте масштабирование группы ВМ
  • Как удалить созданные ресурсы
  • Как создать инфраструктуру с помощью Terraform