Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Истории успеха
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Доступны в регионе
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • ИИ для бизнеса
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Партнёрская программа
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Истории успеха
  • Документация
  • Блог
Проект Яндекса
© 2025 ТОО «Облачные Сервисы Казахстан»
Yandex Cloud Functions
  • Сопоставление с другими сервисами Yandex Cloud
    • Все практические руководства
    • Создание навыка Алисы
    • Развертывание веб-приложения
    • Разработка навыка Алисы и сайта с авторизацией
    • Запись данных с устройства в базу данных
    • Запись логов балансировщика в PostgreSQL
    • Разработка Slack-бота
    • Разработка Telegram-бота
    • Подключение к базе данных YDB из функции на Python
    • Подключение к базе данных YDB из функции на Node.js
    • Конвертация видео в GIF на Python
    • Создание функции Node.js с помощью TypeScript
    • Разработка пользовательской интеграции
    • Создание триггера для бюджетов, который вызывает функцию для остановки ВМ
    • Создание интерактивного serverless-приложения с использованием WebSocket
    • Автоматическое копирование объектов из одного бакета Object Storage в другой
    • Запуск вычислений по расписанию в DataSphere
    • Интерактивная отладка функций
    • Регулярное асинхронное распознавание аудиофайлов из Object Storage
    • Канареечный релиз функции Cloud Functions
    • Развертывание отказоустойчивой архитектуры с прерываемыми ВМ
    • Создание триггеров, которые вызывают функции для остановки ВМ и отправки уведомлений в Telegram
    • Загрузка данных из Яндекс Директ в витрину Yandex Managed Service for ClickHouse® с использованием Yandex Cloud Functions, Yandex Object Storage и Yandex Data Transfer
      • Обзор
      • Консоль управления, CLI и API
      • Terraform
    • Мониторинг состояния географически распределенных устройств
    • Мониторинг показаний датчиков и уведомления о событиях
    • Эмуляция множества IoT-устройств
    • Передача событий Yandex Cloud Postbox в Yandex Data Streams и их анализ с помощью Yandex DataLens
    • Сокращатель ссылок
    • Yandex Tracker: экспорт и визуализация данных
    • Запуск вычислений в DataSphere с помощью API
    • Разработка Telegram-бота для распознавания текста и аудио
    • Настройка реагирования в Yandex Cloud Logging и Cloud Functions
    • Разработка функций в Functions Framework и их развертывание в Yandex Serverless Containers
    • Настройка CI/CD с SourceCraft
    • Настройка CI/CD с GitHub
    • Создание AI-агента с помощью Cloud Functions
    • Интеграция Yandex Cloud Postbox с внешними системами через вебхуки
  • Инструменты
  • Правила тарификации
  • Управление доступом
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Публичные материалы
  • История изменений
  • Вопросы и ответы
  • Обучающие курсы

В этой статье:

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Создайте инфраструктуру
  • Проверьте масштабирование группы ВМ
  • Как удалить созданные ресурсы
  1. Практические руководства
  2. Масштабирование группы виртуальных машин по расписанию
  3. Terraform

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

Статья создана
Yandex Cloud
Улучшена
Обновлена 11 июля 2025 г.
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
  • Создайте инфраструктуру
  • Проверьте масштабирование группы ВМ
  • Как удалить созданные ресурсы

Важно

Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.

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

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

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

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

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

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

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

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

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

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

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

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

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

Terraform распространяется под лицензией Business Source License, а провайдер Yandex Cloud для Terraform — под лицензией MPL-2.0.

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

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

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

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

    Готовая конфигурация
    Вручную
    1. Клонируйте репозиторий с конфигурационными файлами.

      git clone https://github.com/yandex-cloud-examples/yc-vm-group-scheduled-scaling
      
    2. Перейдите в директорию с репозиторием. В ней должны появиться файлы:

      • vm-scale-scheduled.tf — конфигурация создаваемой инфраструктуры.
      • vm-scale-scheduled.auto.tfvars — файл с пользовательскими данными.
      • vm-scale-scheduled-function.zip — архив с кодом функции Cloud Functions.
    1. Создайте папку для файлов.

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

      • Конфигурационный файл vm-scale-scheduled.tf:

        vm-scale-scheduled.tf
        # Объявление переменных для конфиденциальных параметров
        
        variable "folder_id" {
          type = string
        }
        
        variable "username" {
          type = string
        }
        
        variable "ssh_key_path" {
          type = string
        }
        
        # Настройка провайдера
        
        terraform {
          required_providers {
            yandex = {
              source  = "yandex-cloud/yandex"
              version = ">= 0.47.0"
            }
          }
        }
        
        provider "yandex" {
          folder_id = var.folder_id
        }
        
        # Создание сервисного аккаунта и назначение ему ролей
        
        resource "yandex_iam_service_account" "vm-scale-scheduled-sa" {
          name      = "vm-scale-scheduled-sa"
        }
        
        resource "yandex_resourcemanager_folder_iam_member" "vm-scale-scheduled-sa-role-compute" {
          folder_id = var.folder_id
          role      = "compute.editor"
          member    = "serviceAccount:${yandex_iam_service_account.vm-scale-scheduled-sa.id}"
        }
        
        resource "yandex_resourcemanager_folder_iam_member" "vm-scale-scheduled-sa-role-iam" {
          folder_id = var.folder_id
          role      = "iam.serviceAccounts.user"
          member    = "serviceAccount:${yandex_iam_service_account.vm-scale-scheduled-sa.id}"
        }
        
        resource "yandex_resourcemanager_folder_iam_member" "vm-scale-scheduled-sa-role-functions" {
          folder_id = var.folder_id
          role      = "functions.functionInvoker"
          member    = "serviceAccount:${yandex_iam_service_account.vm-scale-scheduled-sa.id}"
        }
        
        # Создание облачной сети и подсетей
        
        resource "yandex_vpc_network" "vm-scale-scheduled-network" {
          name = "vm-scale-scheduled-network"
        }
        
        resource "yandex_vpc_subnet" "vm-scale-scheduled-subnet-a" {
          name           = "vm-scale-scheduled-subnet-a"
          zone           = "kz1-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           = "kz1-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 = [
              "kz1-a",
              "kz1-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: ${var.username}\n    groups: sudo\n    shell: /bin/bash\n    sudo: 'ALL=(ALL) NOPASSWD:ALL'\n    ssh_authorized_keys:\n      - ${file("${var.ssh_key_path}")}"
            }
          }
        
          scale_policy {
            fixed_scale {
              size = 2
            }
          }
        
          deploy_policy {
            max_unavailable = 2
            max_creating    = 2
            max_expansion   = 2
            max_deleting    = 2
          }
        
          depends_on = [
            yandex_resourcemanager_folder_iam_member.vm-scale-scheduled-sa-role-compute,
            yandex_resourcemanager_folder_iam_member.vm-scale-scheduled-sa-role-iam
          ]
        }
        
        # Создание функции
        
        resource "yandex_function" "vm-scale-scheduled-function" {
          name               = "vm-scale-scheduled-function"
          runtime            = "bash"
        
          user_hash          = "function-v1"
          entrypoint         = "handler.sh"
          content {
            zip_filename = "vm-scale-scheduled-function.zip"
          }
        
          execution_timeout  = "60"
          memory             = "128"
          service_account_id = yandex_iam_service_account.vm-scale-scheduled-sa.id
        
          environment = {
            IG_NAME      = yandex_compute_instance_group.vm-scale-scheduled-ig.name
            IG_BASE_SIZE = "2"
            FOLDER_ID    = var.folder_id
          }
        
          depends_on = [
            yandex_resourcemanager_folder_iam_member.vm-scale-scheduled-sa-role-functions
          ]
        }
        
        # Создание тригера
        
        resource "yandex_function_trigger" "vm-scale-scheduled-trigger" {
          name = "vm-scale-scheduled-trigger"
          timer {
            cron_expression = "*/2 * * * ? *"
          }
          function {
            id                 = yandex_function.vm-scale-scheduled-function.id
            tag                = "$latest"
            service_account_id = yandex_iam_service_account.vm-scale-scheduled-sa.id
          }
        
          depends_on = [
            yandex_resourcemanager_folder_iam_member.vm-scale-scheduled-sa-role-functions
          ]
        }
        
      • Файл с пользовательскими данными vm-scale-scheduled.auto.tfvars:

        vm-scale-scheduled.auto.tfvars
        folder_id    = "<идентификатор_каталога>"
        username     = "<имя_пользователя_ВМ>"
        ssh_key_path = "<путь_к_публичному_SSH-ключу>"
        
      • Файл с кодом функции 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.

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

    • Сервисный аккаунт — yandex_iam_service_account.
    • Сеть — yandex_vpc_network.
    • Подсети — yandex_vpc_subnet.
    • Образ ВМ — yandex_compute_image.
    • Группа ВМ — yandex_compute_instance_group.
    • Функция — yandex_function.
    • Триггер — yandex_function_trigger.
  3. В файле vm-scale-scheduled.auto.tfvars задайте пользовательские параметры:

    • 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.

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

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

Консоль управления
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: cl1l0ljqbmkp********
folder_id: b1g9hv2loamq********
created_at: "2022-03-28T13:24:20.693Z"
...
managed_instances_state:
  target_size: "2"
  running_actual_count: "2"
...

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

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

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

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

  1. Откройте конфигурационный файл vm-scale-scheduled.tf и удалите описание создаваемой инфраструктуры из файла.

  2. Примените изменения:

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

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

      terraform validate
      

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

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

      terraform plan
      

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

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

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

См. такжеСм. также

  • Масштабирование группы виртуальных машин по расписанию с помощью консоли управления, CLI и API.

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

Предыдущая
Консоль управления, CLI и API
Следующая
Мониторинг состояния географически распределенных устройств
Проект Яндекса
© 2025 ТОО «Облачные Сервисы Казахстан»