[Документация Yandex Cloud](../../../../index.md) > [Практические руководства](../../../index.md) > [Безопасность](../../index.md) > [Миграция сервисов с балансировщика NLB на L7-балансировщик ALB для подключения защиты Smart Web Security](../index.md) > [Балансировщик NLB с целевыми ресурсами из группы виртуальных машин](index.md) > Terraform

# Миграция сервисов с балансировщика NLB с целевыми ресурсами из группы виртуальных машин (Instance Groups) на L7-балансировщик ALB с помощью Terraform

# Миграция сервисов с балансировщика NLB с целевыми ресурсами из группы виртуальных машин (Instance Groups) на L7-балансировщик ALB с помощью Terraform


{% note warning %}

Часть ресурсов, необходимых для прохождения практического руководства, доступны только в [регионе Россия](../../../../overview/concepts/region.md).

{% endnote %}


Чтобы мигрировать сервис с сетевого балансировщика на L7-балансировщик:

1. [Ознакомьтесь с рекомендациями по миграции сервисов](#recommendations).
1. [Создайте инфраструктуру](#deploy). На этом этапе вы подключите профиль безопасности Smart Web Security к виртуальному хосту L7-балансировщика.
1. [Проверьте работу L7-балансировщика](#test).
1. [Мигрируйте пользовательскую нагрузку с сетевого балансировщика на L7-балансировщик](#migration-nlb-to-alb).

## Рекомендации по миграции сервисов {#recommendations}

1. Подключите защиту от DDoS-атак на уровне L3-L4 ([модель OSI](https://ru.wikipedia.org/wiki/Сетевая_модель_OSI)). Она станет дополнением к защите на уровне L7, которую после миграции обеспечит [Yandex Smart Web Security](../../../../smartwebsecurity/index.md).

    Чтобы подключить защиту на уровне L3-L4:

    1. Перед миграцией [зарезервируйте статический публичный IP-адрес с защитой от DDoS-атак](../../../../vpc/operations/enable-ddos-protection.md#enable-on-reservation) и используйте этот адрес для обработчика L7-балансировщика. Если для сетевого балансировщика публичный IP с защитой уже есть, его можно сохранить при миграции. В противном случае IP-адрес придется поменять на защищенный.

    1. Настройте порог для срабатывания механизмов защиты, который будет соответствовать объему легитимного трафика на защищаемый ресурс. Для настройки такого порога обратитесь в [техническую поддержку](https://kz.center.yandex.cloud/support).

    1. [Задайте](../../../../vpc/operations/adjust-mtu-ddos-protection.md) значение MTU равным `1450` на целевых ресурсах за балансировщиком. Подробнее в разделе [MTU и TCP MSS](../../../../vpc/concepts/mtu-mss.md).

1. Проводите миграцию в часы наименьшей пользовательской нагрузки. Во время миграции ваш сервис будет недоступен, пока для группы ВМ изменяется интеграция с целевой группой и публичный IP-адрес переносится с сетевого балансировщика на L7-балансировщик. Время недоступности сервиса зависит от количества ВМ в группе, настроек [политик развертывания](../../../../compute/concepts/instance-groups/policies/deploy-policy.md) и обычно занимает от нескольких минут до нескольких десятков минут.

1. При использовании L7-балансировщика запросы на бэкенды приходят с IP-адресом источника из диапазона внутренних IP-адресов подсетей, указанных при создании L7-балансировщика. Исходный IP-адрес источника запроса (пользователя) фигурирует в заголовке `X-Forwarded-For`. Если необходимо логировать публичные IP-адреса пользователей на веб-сервере, [измените его конфигурацию](../../../../troubleshooting/application-load-balancer/how-to/getting-external-src-ip-in-x-forwarded-for-headers.md).

1. Перед миграцией определите минимальное количество ресурсных единиц для настройки [автомасштабирования](../../../../application-load-balancer/concepts/application-load-balancer.md#lcu-scaling) в L7-балансировщике.

    Количество ресурсных единиц выберите на основе анализа нагрузки на ваш сервис по следующим показателям:

    * количество запросов в секунду (RPS);
    * количество одновременных активных соединений;
    * количество новых соединений в секунду;
    * объем трафика в секунду.

## Создайте инфраструктуру {#deploy}

1. Если у вас еще нет Terraform, [установите его](../../../infrastructure-management/terraform-quickstart.md#install-terraform).
1. [Получите данные для аутентификации](../../../infrastructure-management/terraform-quickstart.md#get-credentials). Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
1. [Настройте и инициализируйте провайдер](../../../infrastructure-management/terraform-quickstart.md#configure-provider). Чтобы не создавать конфигурационный файл с настройками провайдера вручную, [скачайте его](https://github.com/yandex-cloud-examples/yc-terraform-provider-settings/blob/main/provider.tf).
1. Поместите конфигурационный файл в отдельную рабочую директорию и [укажите значения параметров](../../../infrastructure-management/terraform-quickstart.md#configure-provider). Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

1. Скачайте в ту же рабочую директорию файл конфигурации в зависимости от используемого протокола:
    * `HTTP` — файл конфигурации [alb-vm-http.tf](https://github.com/yandex-cloud-examples/yc-nlb-alb-ig-migration/blob/main/alb-vm-http.tf).
    * `HTTPS` — файл конфигурации [alb-vm-https.tf](https://github.com/yandex-cloud-examples/yc-nlb-alb-ig-migration/blob/main/alb-vm-https.tf).

    В этих файлах описаны:

    * [подсети](../../../../vpc/concepts/network.md#subnet) для L7-балансировщика;
    * [группа безопасности](../../../../vpc/concepts/security-groups.md) для L7-балансировщика;
    * статический адрес для L7-балансировщика;
    * импорт TLS-сертификата в Certificate Manager (если используется протокол `HTTPS`);
    * профиль безопасности Smart Web Security;
    * целевая группа, группа бэкендов и HTTP-роутер для L7-балансировщика;
    * L7-балансировщик.

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

    1. Укажите значения переменных:

        * `domain_name` — имя домена вашего сервиса.
        * `network_id` — идентификатор сети, в которой находятся виртуальные машины из целевой группы сетевого балансировщика нагрузки.
        * `certificate` (если используется протокол `HTTPS`) — путь к файлу самоподписанного пользовательского сертификата.
        * `private_key` (если используется протокол `HTTPS`) — путь к файлу с закрытым ключом.

    1. Для ресурса `yandex_alb_target_group` добавьте столько блоков `target`, сколько виртуальных машин находится в целевой группе вашего сетевого балансировщика нагрузки:

        ```hcl
        resource "yandex_alb_target_group" "alb-target-group" {
          ...
          target {
            subnet_id    = "<идентификатор_подсети>"
            ip_address   = "<внутренний_IP-адрес_ВМ_1>"
          }
          target {
            subnet_id    = "<идентификатор_подсети>"
            ip_address   = "<внутренний_IP-адрес_ВМ_2>"
          }
          ...
          target {
            subnet_id    = "<идентификатор_подсети>"
            ip_address   = "<внутренний_IP-адрес_ВМ_N>"
          }
        }
        ```

        Где:

        * `subnet_id` — идентификатор подсети, в которой расположена виртуальная машина.
        * `ip_address` — внутренний IP-адрес виртуальной машины, указанной в целевой группе вашего сетевого балансировщика нагрузки.

    1. Если для вашего сервиса требуется, чтобы запросы в рамках одной пользовательской сессии обрабатывал один и тот же ресурс бэкенда, включите для группы бэкендов [привязку сессий](../../../../application-load-balancer/concepts/backend-group.md#session-affinity) (session affinity) — для ресурса `yandex_alb_backend_group` раскомментируйте блок:

        ```hcl
        session_affinity {
          connection {
            source_ip = true
          }
        }
        ```

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

    ```bash
    terraform validate
    ```

    Если в файлах конфигурации есть ошибки, Terraform на них укажет.

1. Создайте необходимую инфраструктуру:

    1. Выполните команду для просмотра планируемых изменений:
    
       ```bash
       terraform plan
       ```
    
       Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
    
    1. Если вас устраивают планируемые изменения, внесите их:
       1. Выполните команду:
    
          ```bash
          terraform apply
          ```
    
       1. Подтвердите изменение ресурсов.
       1. Дождитесь завершения операции.

    В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в [консоли управления](https://kz.console.yandex.cloud).

1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в каталог, в котором создан L7-балансировщик.
1. Перейдите в сервис **Application Load Balancer**.
1. Дождитесь, когда L7-балансировщик перейдет в статус `Active`.
1. Укажите настройки автомасштабирования в L7-балансировщике:

    1. В консоли управления нажмите на имя нужного балансировщика.
    1. Нажмите ![image](../../../../_assets/console-icons/ellipsis.svg) и выберите **Редактировать**.
    1. В блоке **Настройки автомасштабирования** укажите ограничения на количество [ресурсных единиц](../../../../application-load-balancer/concepts/application-load-balancer.md#lcu-scaling).
    1. Нажмите кнопку **Сохранить**.

## Проверьте работу L7-балансировщика {#test}

1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в созданный L7-балансировщик и слева выберите **Проверки состояния**. Убедитесь, что все проверки состояния L7-балансировщика показывают состояние `HEALTHY`.

1. Протестируйте запрос к сервису через L7-балансировщик. Например, одним из способов:
   
   * В файле `hosts` на рабочей станции добавьте запись `<публичный_IP-адрес_L7-балансировщика> <имя_домена_сервиса>`. Удалите запись после тестирования.
   * Выполните запрос с помощью [cURL](https://curl.se/) в зависимости от типа протокола:
   
       ```bash
       curl http://<имя_домена_сервиса> \
           --resolve <имя_домена_сервиса>:<порт_сервиса>:<публичный_IP-адрес_L7-балансировщика>
       ```
   
       ```bash
       curl https://<имя_домена_сервиса> \
           --resolve <имя_домена_сервиса>:<порт_сервиса>:<публичный_IP-адрес_L7-балансировщика>
       ```

## Мигрируйте пользовательскую нагрузку с сетевого балансировщика на L7-балансировщик {#migration-nlb-to-alb}

{% note warning %}

В процессе миграции будут пересозданы ВМ бэкенда.

{% endnote %}

Если обработчик сетевого балансировщика использует публичный IP-адрес без защиты от DDoS, запомните текущие настройки [проверок состояния](../../../../network-load-balancer/concepts/health-check.md) для целевой группы в сетевом балансировщике, прежде чем приступать к миграции. Эти настройки понадобятся при подключении новой целевой группы к балансировщику.

Чтобы мигрировать нагрузку:

1. Измените для группы ВМ интеграцию с целевой группой:

    1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в каталог, в котором находится группа ВМ.
    1. Перейдите в сервис **Compute Cloud**.
    1. На панели слева выберите ![image](../../../../_assets/console-icons/layers-3-diagonal.svg) **Группы виртуальных машин**.
    1. Выберите группу, которую хотите изменить.
    1. В правом верхнем углу страницы нажмите **Редактировать**.
    1. В блоке **Интеграция с Application Load Balancer** включите опцию **Создать целевую группу**.
    1. Укажите имя целевой группы L7-балансировщика и опционально другие [настройки целевой группы](../../../../compute/concepts/instance-groups/balancers.md#settings-alb).
    1. Нажмите **Сохранить**.

    В процессе изменения группы ВМ происходит следующее:

    * [Пересоздаются ВМ в группе](../../../../compute/concepts/instance-groups/deploy/instance.md#ch-gr-affect).
    * Удаляются целевые ресурсы из целевой группы сетевого балансировщика, на оставшиеся целевые ресурсы распределяется пользовательская нагрузка. У пользователей в это время наблюдается частичная недоступность сервиса через сетевой балансировщик.
    * После удаления всех целевых ресурсов удаляется целевая группа. Сервис становится недоступным через сетевой балансировщик.

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

1. В группе бэкендов L7-балансировщика [измените у бэкенда](../../../../application-load-balancer/operations/backend-group-update.md#update-backend) целевую группу. Укажите только целевую группу, созданную на предыдущем шаге.

    В целевую группу L7-балансировщика автоматически будут добавляться ВМ из группы ВМ.

1. Выберите один из вариантов дальнейшей миграции пользовательской нагрузки с сетевого балансировщика на L7-балансировщик в зависимости от наличия у обработчика сетевого балансировщика публичного IP-адреса с защитой или без защиты от DDoS:

    * [Обработчик сетевого балансировщика использует публичный IP-адрес с защитой от DDoS](#ip-with-ddos-protection). При миграции сохранится публичный IP-адрес для вашего сервиса.
    * [Обработчик сетевого балансировщика использует публичный IP-адрес без защиты от DDoS](#ip-without-ddos-protection). При миграции изменится публичный IP-адрес для вашего сервиса.

### Обработчик сетевого балансировщика использует публичный IP-адрес с защитой от DDoS {#ip-with-ddos-protection}

1. [Удалите обработчик](../../../../network-load-balancer/operations/listener-remove.md) в сетевом балансировщике для освобождения статического публичного IP-адреса.

1. В L7-балансировщике назначьте обработчику публичный IP-адрес, который ранее был у сетевого балансировщика:

    1. Откройте конфигурационный файл, который вы использовали для создания L7-балансировщика (`alb-vm-http.tf` или `alb-vm-https.tf`).

    1. Измените в описании балансировщика значение параметра `address` в блоке `listener.endpoint.address.external_ipv4_address`:

        ```hcl
        resource "yandex_alb_load_balancer" "<имя_балансировщика>" {
          ...
          listener {
            ...
            endpoint {
              address {
                external_ipv4_address {
                  address = <публичный_IP-адрес_сервиса>
                }
              }
              ports = [ <порт_сервиса> ]
            }
          }
        }
        ```

        Где `address` — это публичный IP-адрес, который ранее был у сетевого балансировщика.

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

        1. В терминале перейдите в директорию с конфигурационным файлом.
        1. Проверьте корректность конфигурации с помощью команды:
        
           ```bash
           terraform validate
           ```
        
           Если конфигурация является корректной, появится сообщение:
        
           ```bash
           Success! The configuration is valid.
           ```
        
        1. Выполните команду:
        
           ```bash
           terraform plan
           ```
        
           В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
        1. Примените изменения конфигурации:
        
           ```bash
           terraform apply
           ```
        
        1. Подтвердите изменения: введите в терминале слово `yes` и нажмите **Enter**.

1. После изменения IP-адреса восстановится доступность вашего сервиса через L7-балансировщик. Наблюдайте за пользовательской нагрузкой, поступающей на L7-балансировщик, на графиках [статистики работы балансировщика](../../../../application-load-balancer/operations/application-load-balancer-get-stats.md).

1. Удалите освободившийся статический публичный IP-адрес, который был выбран при создании L7-балансировщика.

    1. Откройте конфигурационный файл, который вы использовали для создания L7-балансировщика (`alb-vm-http.tf` или `alb-vm-https.tf`).

    1. Удалите из файла описание ресурса `yandex_vpc_address`:

        ```hcl
        resource "yandex_vpc_address" "static-address" {
          description = "Static public IP address for the Application Load Balancer"
          name        = "alb-static-address"
          external_ipv4_address {
            zone_id                  = "ru-central1-a"
            ddos_protection_provider = "qrator"
          }
        }
        ```

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

        1. В терминале перейдите в директорию с конфигурационным файлом.
        1. Проверьте корректность конфигурации с помощью команды:
        
           ```bash
           terraform validate
           ```
        
           Если конфигурация является корректной, появится сообщение:
        
           ```bash
           Success! The configuration is valid.
           ```
        
        1. Выполните команду:
        
           ```bash
           terraform plan
           ```
        
           В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
        1. Примените изменения конфигурации:
        
           ```bash
           terraform apply
           ```
        
        1. Подтвердите изменения: введите в терминале слово `yes` и нажмите **Enter**.

1. (Опционально) После переноса пользовательской нагрузки на L7-балансировщик [удалите сетевой балансировщик](../../../../network-load-balancer/operations/load-balancer-delete.md).

### Обработчик сетевого балансировщика использует публичный IP-адрес без защиты от DDoS {#ip-without-ddos-protection}

1. Наблюдайте за [состоянием целевых ресурсов](../../../../network-load-balancer/operations/check-resource-health.md) сетевого балансировщика. Дождитесь автоматического удаления целевых ресурсов из целевой группы.

1. [Создайте целевую группу](../../../../network-load-balancer/operations/target-group-create.md) сетевого балансировщика. Добавьте ВМ, которые были пересозданы при изменении группы ВМ.

1. В сетевом балансировщике [подключите целевую группу](../../../../network-load-balancer/operations/target-group-attach.md), созданную на предыдущем шаге. При подключении целевой группы настройте проверки состояния, которые были у исходной целевой группы.

1. Дождитесь перехода [проверок состояния](../../../../network-load-balancer/operations/check-resource-health.md) ВМ в целевой группе сетевого балансировщика в статус `Healthy`. После этого восстановится доступность вашего сервиса через сетевой балансировщик.

1. Чтобы мигрировать пользовательскую нагрузку с сетевого балансировщика на L7-балансировщик, в DNS-сервисе, обслуживающем публичную зону вашего домена, измените значение A-записи для доменного имени сервиса на публичный IP-адрес L7-балансировщика. Если публичная зона домена была создана в [Yandex Cloud DNS](../../../../dns/index.md), то измените запись [по инструкции](../../../../dns/operations/resource-record-update.md).

    {% note info %}

    Миграция нагрузки может выполняться долго, так как распространение изменений в записи DNS зависит от времени жизни записи (TTL) и количества звеньев цепочки DNS-запросов.

    {% endnote %}

1. По мере распространения изменений в записи DNS наблюдайте за ростом запросов, поступающих на L7-балансировщик, на графиках [статистики работы балансировщика](../../../../application-load-balancer/operations/application-load-balancer-get-stats.md).

1. Наблюдайте за снижением нагрузки на сетевой балансировщик с помощью [метрик балансировщика](../../../../monitoring/metrics-ref/network-load-balancer-ref.md) `processed_bytes` и `processed_packets`. Для визуализации этих метрик можно [создать дашборд](../../../../monitoring/operations/dashboard/create.md). Если нагрузка на сетевом балансировщике долгое время отсутствует, то перенос на L7-балансировщик завершен.

1. (Опционально) После переноса пользовательской нагрузки на L7-балансировщик [удалите сетевой балансировщик](../../../../network-load-balancer/operations/load-balancer-delete.md).