Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Application Load Balancer
  • Начало работы
    • Все практические руководства
    • Организация виртуального хостинга
    • Создание L7-балансировщика с профилем безопасности Smart Web Security через Ingress-контроллер Application Load Balancer
    • Интеграция L7-балансировщика с CDN и Object Storage
    • Сине-зеленое и канареечное развертывание версий сервиса
    • Запись логов балансировщика в PostgreSQL
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием в Yandex Managed Service for Kubernetes
    • Настройка Gateway API в Yandex Managed Service for Kubernetes
    • Настройка L7-балансировщика Application Load Balancer с помощью Ingress-контроллера
    • Настройка логирования для L7-балансировщика Application Load Balancer с помощью Ingress-контроллера
      • Обзор
      • Консоль управления
      • Terraform
    • Проверка состояния приложений в кластере Managed Service for Kubernetes с помощью L7-балансировщика Application Load Balancer
    • Реализация защищенной высокодоступной сетевой инфраструктуры с выделением DMZ на основе Next-Generation Firewall
    • Создание L7-балансировщика Application Load Balancer с профилем безопасности Smart Web Security
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Логи L7-балансировщика
  • История изменений
  • Обучающие курсы

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

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Создайте инфраструктуру
  • Загрузите файлы веб-сайта
  • Протестируйте отказоустойчивость
  • Как удалить созданные ресурсы
  1. Практические руководства
  2. Отказоустойчивый сайт с балансировкой нагрузки через Application Load Balancer
  3. Terraform

Отказоустойчивый сайт с балансировкой нагрузки через Yandex Application Load Balancer с помощью Terraform

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

Чтобы создать инфраструктуру для сайта с балансировкой нагрузки в трех зонах доступности с использованием балансировщика Application Load Balancer c помощью Terraform:

  1. Подготовьте облако к работе.
  2. Создайте инфраструктуру.
  3. Загрузите файлы веб-сайта.
  4. Протестируйте отказоустойчивость.

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

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

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

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

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

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

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

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

  • плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud);
  • плата за использование динамического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud);
  • плата за балансировку трафика (см. тарифы Application Load Balancer);
  • плата за публичные DNS-запросы и зоны DNS, если вы используете Yandex Cloud DNS (см. тарифы Cloud DNS).

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

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

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

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

Чтобы разместить в группе ВМ отказоустойчивый сайт с балансировкой нагрузки через Application Load Balancer с помощью Terraform:

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

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

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

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

      • application-load-balancer-website.tf — конфигурация создаваемой инфраструктуры.
      • application-load-balancer-website.auto.tfvars — файл с пользовательскими данными.
    1. Создайте папку для конфигурационных файлов.
    2. Создайте в папке:
      1. Конфигурационный файл application-load-balancer-website.tf:

        application-load-balancer-website.tf
        # Объявление переменных для конфиденциальных параметров
        
        variable "folder_id" {
          type = string
        }
        
        variable "vm_user" {
          type = string
        }
        
        variable "ssh_key_path" {
          type      = string
          sensitive = true
        }
        
        variable "domain" {
          type      = string
        }
        
        # Добавление прочих переменных
        
        locals {
          sa_name      = "ig-sa"
          network_name = "network1"
          subnet_name1 = "subnet-1"
          subnet_name2 = "subnet-2"
          subnet_name3 = "subnet-3"
        }
        
        # Настройка провайдера
        
        terraform {
          required_providers {
            yandex = {
              source  = "yandex-cloud/yandex"
              version = ">= 0.47.0"
            }
          }
        }
        
        provider "yandex" {
          zone = "ru-central1-a"
        }
        
        # Создание сервисного аккаунта и назначение прав
        
        resource "yandex_iam_service_account" "ig-sa" {
          name = local.sa_name
        }
        
        resource "yandex_resourcemanager_folder_iam_member" "editor" {
          folder_id = var.folder_id
          role      = "editor"
          member    = "serviceAccount:${yandex_iam_service_account.ig-sa.id}"
        }
        
        # Создание облачной сети и подсетей
        
        resource "yandex_vpc_network" "network-1" {
          name = local.network_name
        }
        
        resource "yandex_vpc_subnet" "subnet-1" {
          name           = local.subnet_name1
          zone           = "ru-central1-a"
          network_id     = yandex_vpc_network.network-1.id
          v4_cidr_blocks = ["192.168.1.0/24"]
        }
        
        resource "yandex_vpc_subnet" "subnet-2" {
          name           = local.subnet_name2
          zone           = "ru-central1-b"
          network_id     = yandex_vpc_network.network-1.id
          v4_cidr_blocks = ["192.168.2.0/24"]
        }
        
        resource "yandex_vpc_subnet" "subnet-3" {
          name           = local.subnet_name3
          zone           = "ru-central1-d"
          network_id     = yandex_vpc_network.network-1.id
          v4_cidr_blocks = ["192.168.3.0/24"]
        }
        
        # Создание групп безопасности
        
        resource "yandex_vpc_security_group" "alb-sg" {
          name        = "alb-sg"
          network_id  = yandex_vpc_network.network-1.id
        
          egress {
            protocol       = "ANY"
            description    = "any"
            v4_cidr_blocks = ["0.0.0.0/0"]
            from_port      = 1
            to_port        = 65535
          }
        
          ingress {
            protocol       = "TCP"
            description    = "ext-http"
            v4_cidr_blocks = ["0.0.0.0/0"]
            port           = 80
          }
        
          ingress {
            protocol       = "TCP"
            description    = "ext-https"
            v4_cidr_blocks = ["0.0.0.0/0"]
            port           = 443
          }
        
          ingress {
            protocol          = "TCP"
            description       = "healthchecks"
            predefined_target = "loadbalancer_healthchecks"
            port              = 30080
          }
        }
        
        resource "yandex_vpc_security_group" "alb-vm-sg" {
          name        = "alb-vm-sg"
          network_id  = yandex_vpc_network.network-1.id
        
          ingress {
            protocol          = "TCP"
            description       = "balancer"
            security_group_id = yandex_vpc_security_group.alb-sg.id
            port              = 80
          }
        
          ingress {
            protocol       = "TCP"
            description    = "ssh"
            v4_cidr_blocks = ["0.0.0.0/0"]
            port           = 22
          }
        }
        
        # Создание группы ВМ для сайта
        
        resource "yandex_compute_image" "lemp" {
          source_family = "lemp"
        }
        
        resource "yandex_compute_instance_group" "alb-vm-group" {
          name               = "alb-vm-group"
          folder_id          = var.folder_id
          service_account_id = yandex_iam_service_account.ig-sa.id
          instance_template {
            platform_id        = "standard-v2"
            service_account_id = yandex_iam_service_account.ig-sa.id
            resources {
              core_fraction = 5
              memory        = 1
              cores         = 2
            }
        
            boot_disk {
              mode = "READ_WRITE"
              initialize_params {
                image_id = yandex_compute_image.lemp.id
                type     = "network-hdd"
                size     = 3
              }
            }
        
            network_interface {
              network_id         = yandex_vpc_network.network-1.id
              subnet_ids         = [yandex_vpc_subnet.subnet-1.id,yandex_vpc_subnet.subnet-2.id,yandex_vpc_subnet.subnet-3.id]
              nat                = true
              security_group_ids = [yandex_vpc_security_group.alb-vm-sg.id]
            }
        
            metadata = {
              user-data = "#cloud-config\nusers:\n  - name: ${var.vm_user}\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 = 3
            }
          }
        
          allocation_policy {
            zones = ["ru-central1-a", "ru-central1-b", "ru-central1-d"]
          }
        
          deploy_policy {
            max_unavailable = 1
            max_expansion   = 0
          }
        
          application_load_balancer {
            target_group_name = "alb-tg"
          }
        }
        
        # Создание группы бэкендов
        
        resource "yandex_alb_backend_group" "alb-bg" {
          name                     = "alb-bg"
          http_backend {
            name                   = "backend-1"
            port                   = 80
            target_group_ids       = [yandex_compute_instance_group.alb-vm-group.application_load_balancer.0.target_group_id]
            healthcheck {
              timeout              = "10s"
              interval             = "2s"
              healthcheck_port     = 80
              http_healthcheck {
                path               = "/"
              }
            }
          }
        }
        
        # Создание HTTP-роутера и виртуального хоста
        
        resource "yandex_alb_http_router" "alb-router" {
          name   = "alb-router"
        }
        
        resource "yandex_alb_virtual_host" "alb-host" {
          name           = "alb-host"
          http_router_id = yandex_alb_http_router.alb-router.id
          authority      = [var.domain, "www.${var.domain}"]
          route {
            name = "route-1"
            http_route {
              http_route_action {
                backend_group_id = yandex_alb_backend_group.alb-bg.id
              }
            }
          }
        }
        
        # Создание L7-балансировщика
        
        resource "yandex_alb_load_balancer" "alb-1" {
          name               = "alb-1"
          network_id         = yandex_vpc_network.network-1.id
          security_group_ids = [yandex_vpc_security_group.alb-sg.id]
        
          allocation_policy {
            location {
              zone_id   = "ru-central1-a"
              subnet_id = yandex_vpc_subnet.subnet-1.id
            }
        
            location {
              zone_id   = "ru-central1-b"
              subnet_id = yandex_vpc_subnet.subnet-2.id
            }
        
            location {
              zone_id   = "ru-central1-d"
              subnet_id = yandex_vpc_subnet.subnet-3.id
            }
          }
        
          listener {
            name = "alb-listener"
            endpoint {
              address {
                external_ipv4_address {
                }
              }
              ports = [ 80 ]
            }
            http {
              handler {
                http_router_id = yandex_alb_http_router.alb-router.id
              }
            }
          }
        }
        
        # Создание DNS-зоны
        
        resource "yandex_dns_zone" "alb-zone" {
          name        = "alb-zone"
          description = "Public zone"
          zone        = "${var.domain}."
          public      = true
        }
        
        # Создание ресурсных записей в DNS-зоне
        
        resource "yandex_dns_recordset" "rs-1" {
          zone_id = yandex_dns_zone.alb-zone.id
          name    = "${var.domain}."
          ttl     = 600
          type    = "A"
          data    = [yandex_alb_load_balancer.alb-1.listener[0].endpoint[0].address[0].external_ipv4_address[0].address]
        }
        
        resource "yandex_dns_recordset" "rs-2" {
          zone_id = yandex_dns_zone.alb-zone.id
          name    = "www"
          ttl     = 600
          type    = "CNAME"
          data    = [ var.domain ]
        }
        
      2. Файл с пользовательскими данными application-load-balancer-website.auto.tfvars:

        application-load-balancer-website.auto.tfvars
        folder_id    = "<идентификатор_каталога>"
        vm_user      = "<имя_пользователя_ВМ>"
        ssh_key_path = "<путь_к_публичному_SSH-ключу>"
        domain       = "<домен>"
        

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

    • Сервисный аккаунт — yandex_iam_service_account.
    • Роль — yandex_resourcemanager_folder_iam_member.
    • Сеть — yandex_vpc_network.
    • Подсети — yandex_vpc_subnet.
    • Группы безопасности — yandex_vpc_security_group.
    • Образ ВМ — yandex_compute_image.
    • Группа ВМ — yandex_compute_instance_group.
    • Группа бэкендов — yandex_alb_backend_group.
    • HTTP-роутер — yandex_alb_http_router.
    • Виртуальный хост — yandex_alb_virtual_host.
    • L7-балансировщик — yandex_alb_load_balancer.
    • DNS-зона — yandex_dns_zone.
    • Ресурсная запись DNS — yandex_dns_recordset.
  3. В файле application-load-balancer-website.auto.tfvars задайте пользовательские параметры:

    • folder_id — идентификатор каталога.
    • vm_user — имя пользователя ВМ.
    • ssh_key_path — путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ. Подробнее см. Создание пары ключей SSH.
    • domain — название домена, например alb-example.com.
  4. Создайте ресурсы:

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

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

      terraform validate
      

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

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

      terraform plan
      

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

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

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

После создания инфраструктуры, загрузите файлы веб-сайта.

Загрузите файлы веб-сайтаЗагрузите файлы веб-сайта

Чтобы проверить работу веб-сервера, необходимо загрузить файлы сайта на каждую ВМ. Для примера вы можете использовать файл index.html из архива.

Для каждой ВМ в созданной группе выполните следующее:

  1. На вкладке Виртуальные машины нажмите на имя нужной ВМ в списке.

  2. Скопируйте Публичный IPv4-адрес из блока Сеть.

  3. Подключитесь к ВМ по протоколу SSH.

  4. Выдайте права на запись для вашего пользователя на директорию /var/www/html:

    sudo chown -R "$USER":www-data /var/www/html
    
  5. Загрузите на ВМ файлы сайта с помощью протокола SCP.

    Linux/macOS
    Windows

    Используйте утилиту командной строки scp:

    scp -r <путь_до_директории_с-файлами> <имя_пользователя_ВМ>@<IP-адрес_ВМ>:/var/www/html
    

    С помощью программы WinSCP скопируйте локальную директорию с файлами в директорию /var/www/html на ВМ.

Протестируйте отказоустойчивостьПротестируйте отказоустойчивость

  1. В консоли управления выберите сервис Compute Cloud.

  2. Перейдите на страницу ВМ из созданной ранее группы.

  3. Скопируйте Публичный IPv4-адрес из блока Сеть.

  4. Подключитесь к ВМ по протоколу SSH.

  5. Остановите веб-сервис, чтобы сымитировать сбой в работе веб-сервера:

    sudo service nginx stop
    
  6. Откройте ваш сайт в браузере. Несмотря на сбой в работе одного из веб-серверов, сайт должен успешно открыться.

  7. После завершения проверки запустите веб-сервис:

    sudo service nginx start
    

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

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

  1. Откройте конфигурационный файл application-load-balancer-website.tf и удалите описание создаваемой инфраструктуры из файла.

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

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

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

      terraform validate
      

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

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

      terraform plan
      

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

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

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

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

  • Отказоустойчивый сайт с балансировкой нагрузки через Yandex Application Load Balancer с помощью консоли управления

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

Предыдущая
Консоль управления
Следующая
Проверка состояния приложений в кластере Managed Service for Kubernetes с помощью L7-балансировщика Application Load Balancer
Проект Яндекса
© 2025 ООО «Яндекс.Облако»