Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Разграничение прав доступа для групп пользователей
      • Обзор
      • Консоль управления, CLI
      • Terraform
    • Создание L7-балансировщика с профилем безопасности Smart Web Security через Ingress-контроллер Application Load Balancer
    • Централизованная публикация в интернете и защита приложений от DDoS
    • Передача логов с виртуальной машины в Cloud Logging
    • Запись логов балансировщика в PostgreSQL
    • Безопасное хранение паролей для GitLab CI в виде секретов Yandex Lockbox
    • Сервисный аккаунт с профилем OS Login для управления ВМ с помощью Ansible
    • Передача логов с Container Optimized Image в Cloud Logging
    • Добавление HTML-страницы для работы SmartCaptcha
    • Создание L7-балансировщика с профилем безопасности
    • Настройка алертов в Monitoring
    • Загрузка аудитных логов в MaxPatrol SIEM
    • Загрузка аудитных логов в SIEM Splunk
    • Загрузка аудитных логов в SIEM ArcSight
    • Шифрование для бакета Object Storage на стороне сервера
    • Шифрование секретов в HashiCorp Terraform
    • Управление ключами KMS с HashiCorp Terraform
    • Auto Unseal в HashiCorp Vault

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

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Создайте инфраструктуру
  • Проверьте работу балансировщика
  • Как удалить созданные ресурсы
  1. Безопасность
  2. Создание L7-балансировщика с защитой от DDoS
  3. Terraform

Создание L7-балансировщика с защитой от DDoS с помощью Terraform

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

Чтобы создать балансировщик с защитой от DDoS c помощью Terraform:

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

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

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

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

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

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

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

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

В стоимость поддержки инфраструктуры для балансировщика с защитой от DDoS входят:

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

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

Чтобы создать инфраструктуру с помощью Terraform:

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

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

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

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

      • alb-with-ddos-protection.tf — конфигурация создаваемой инфраструктуры.
      • alb-with-ddos-protection.auto.tfvars — пользовательские данные.
    1. Создайте папку для файла с описанием инфраструктуры.

    2. Создайте в папке конфигурационный файл alb-with-ddos-protection.tf:

      alb-with-ddos-protection.tf
      variable "folder_id" {
        type = string
      }
      
      variable "vm_user" {
        type = string
      }
      
      variable "ssh_key_path" {
        type = string
      }
      
      locals {
        network_name     = "ddos-network"
        subnet_name1     = "subnet-1"
        subnet_name2     = "subnet-2"
        sa_name          = "ig-sa"
        sg_balancer_name = "ddos-sg-balancer"
        sg_vm_name       = "ddos-sg-vms"
        vm_name          = "ddos-group"
        tg_name          = "tg-ddos"
        address_name     = "ddos-addr"
        abg_name         = "ddos-backend-group"
        backend_name     = "backend-1"
        router_name      = "ddos-router"
        vh_name          = "ddos-host"
        authority_domain = ["alb-with-ddos.com"]
        route_name       = "route-1"
        alb_name         = "ddos-protect-alb"
        listener_name    = "ddos-listener"
      }
      
      terraform {
        required_providers {
          yandex = {
            source  = "yandex-cloud/yandex"
            version = ">= 0.47.0"
          }
        }
      }
      
      provider "yandex" {
        folder_id = var.folder_id
      }
      
      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" "ddos-network" {
        name = local.network_name
      }
      
      resource "yandex_vpc_subnet" "subnet-1" {
        name           = local.subnet_name1
        zone           = "ru-central1-a"
        network_id     = yandex_vpc_network.ddos-network.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.ddos-network.id
        v4_cidr_blocks = ["192.168.2.0/24"]
      }
      
      resource "yandex_vpc_security_group" "ddos-sg-balancer" {
        name       = local.sg_balancer_name
        network_id = yandex_vpc_network.ddos-network.id
      
        egress {
          protocol       = "ANY"
          description    = "any"
          v4_cidr_blocks = ["0.0.0.0/0"]
        }
      
        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" "ddos-sg-vms" {
        name       = local.sg_vm_name
        network_id = yandex_vpc_network.ddos-network.id
      
        ingress {
          protocol          = "TCP"
          description       = "balancer"
          security_group_id = yandex_vpc_security_group.ddos-sg-balancer.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" "ddos-group" {
        name               = local.vm_name
        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.ddos-network.id
            subnet_ids         = [yandex_vpc_subnet.subnet-1.id,yandex_vpc_subnet.subnet-2.id]
            nat                = true
            security_group_ids = [yandex_vpc_security_group.ddos-sg-vms.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 = 2
          }
        }
      
        allocation_policy {
          zones = ["ru-central1-a", "ru-central1-b"]
        }
      
        deploy_policy {
          max_unavailable = 1
          max_expansion   = 0
        }
      
        application_load_balancer {
          target_group_name = local.tg_name
        }
      }
      
      resource "yandex_vpc_address" "ddos-addr" {
        name = local.address_name
      
        external_ipv4_address {
          zone_id                  = "ru-central1-a"
          ddos_protection_provider = "qrator"
        }
      }
      
      resource "yandex_alb_backend_group" "ddos-backend-group" {
        name = local.abg_name
      
        http_backend {
          name             = local.backend_name
          port             = 80
          target_group_ids = [yandex_compute_instance_group.ddos-group.application_load_balancer.0.target_group_id]
          healthcheck {
            timeout          = "10s"
            interval         = "2s"
            healthcheck_port = 80
            http_healthcheck {
              path = "/"
            }
          }
        }
      }
      
      resource "yandex_alb_http_router" "ddos-router" {
        name   = local.router_name
      }
      
      resource "yandex_alb_virtual_host" "ddos-host" {
        name           = local.vh_name
        http_router_id = yandex_alb_http_router.ddos-router.id
        authority      = local.authority_domain
        route {
          name = local.route_name
          http_route {
            http_route_action {
              backend_group_id = yandex_alb_backend_group.ddos-backend-group.id
            }
          }
        }
      }
      
      resource "yandex_alb_load_balancer" "ddos-protect-alb" {
        name               = local.alb_name
        network_id         = yandex_vpc_network.ddos-network.id
        security_group_ids = [yandex_vpc_security_group.ddos-sg-balancer.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
          }
        }
      
        listener {
          name = local.listener_name
          endpoint {
            address {
              external_ipv4_address {
                address = yandex_vpc_address.ddos-addr.external_ipv4_address[0].address
              }
            }
            ports = [ 80 ]
          }
          http {
            handler {
              http_router_id = yandex_alb_http_router.ddos-router.id
            }
          }
        }
      }
      
    3. Создайте в папке файл с пользовательскими данными alb-with-ddos-protection.auto.tfvars:

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

    Более подробную информацию о параметрах используемых ресурсов в 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.
    • Статический публичный IP-адрес — yandex_vpc_address.
    • Группа бэкендов — yandex_alb_backend_group.
    • HTTP-роутер — yandex_alb_http_router.
    • Виртуальный хост — yandex_alb_virtual_host.
    • L7-балансировщик — yandex_alb_load_balancer.
  3. В файле alb-with-ddos-protection.auto.tfvars задайте пользовательские параметры:

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

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

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

      terraform validate
      

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

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

      terraform plan
      

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

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

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

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

Проверьте работу балансировщикаПроверьте работу балансировщика

Проверьте доступность сервиса на хосте alb-with-ddos.com. Для этого выполните команду:

curl \
  --header "Host: alb-with-ddos.com" \
  http://<IP-адрес_L7-балансировщика>

Результат:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
  body {
    width: 35em;
    margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif;
  }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

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

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

  1. Откройте конфигурационный файл alb-with-ddos-protection.tf и удалите описание создаваемой инфраструктуры из файла.

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

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

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

      terraform validate
      

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

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

      terraform plan
      

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

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

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

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

  • Создание L7-балансировщика с защитой от DDoS с помощью консоли управления или CLI

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

Предыдущая
Консоль управления, CLI
Следующая
Создание L7-балансировщика с профилем безопасности Smart Web Security через Ingress-контроллер Application Load Balancer
Проект Яндекса
© 2025 ООО «Яндекс.Облако»