Создание балансировщика с защитой от DDoS
- Подготовьте облако к работе
- Создайте облачную сеть
- Создайте группы безопасности
- Создайте группу ВМ
- Зарезервируйте статический публичный IP-адрес
- Создайте группу бэкендов
- Создайте HTTP-роутер
- Создайте балансировщик
- Проверьте работу балансировщика
- Удалите созданные ресурсы
- Как создать инфраструктуру с помощью Terraform
В этом сценарии вы создадите L7-балансировщик с обработчиком, который имеет публичный IP-адрес с функцией защиты от DDoS-атак.
Чтобы создать L7-балансировщик с защитой от DDoS-атак:
- Подготовьте облако к работе.
- Создайте облачную сеть.
- Создайте группы безопасности.
- Создайте группу ВМ.
- Зарезервируйте статический публичный IP-адрес.
- Создайте группу бэкендов.
- Создайте HTTP-роутер.
- Создайте L7-балансировщик.
- Проверьте работу балансировщика.
Если созданные ресурсы вам больше не нужны, удалите их.
Также инфраструктуру для балансировщика с защитой от DDoS можно развернуть через Terraform с помощью готового файла конфигурации.
Подготовьте облако к работе
Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.
Подробнее об облаках и каталогах.
Создайте облачную сеть
Все ресурсы, созданные в сценарии, будут относиться к одной облачной сети.
Чтобы создать сеть:
- В консоли управления выберите сервис Virtual Private Cloud.
- Нажмите кнопку Создать сеть.
- Укажите имя сети:
ddos-network
. - В поле Дополнительно выберите опцию Создать подсети.
- Нажмите кнопку Создать сеть.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте облачную сеть в каталоге по умолчанию:
yc vpc network create \ --name ddos-network
Подробнее о команде
yc vpc network create
читайте в справочнике CLI. -
Создайте подсети в каждой зоне доступности, указав идентификатор облачной сети с помощью флага
--network-name
:yc vpc subnet create \ --name ddos-network-ru-a \ --network-name ddos-network \ --zone ru-central1-a \ --range 192.168.0.0/24
yc vpc subnet create \ --name ddos-network-ru-b \ --network-name ddos-network \ --zone ru-central1-b \ --range 192.168.1.0/24
yc vpc subnet create \ --name ddos-network-ru-c \ --network-name ddos-network \ --zone ru-central1-c \ --range 192.168.2.0/24
Подробнее о команде
yc vpc subnet create
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте группы безопасности
Примечание
Группы безопасности находятся на стадии Preview. Если они недоступны в вашей сети, для ресурсов будет разрешен весь входящий и исходящий трафик и дополнительной настройки не требуется.
Группы безопасности содержат правила, которые разрешают балансировщику получать входящий трафик и отправлять его на ВМ, а ВМ — получать этот трафик. В сценарии будут созданы две группы безопасности: для балансировщика и для всех ВМ.
Чтобы создать группы безопасности:
-
В консоли управления выберите сервис Virtual Private Cloud.
-
Откройте вкладку Группы безопасности.
-
Создайте группу безопасности для балансировщика:
-
Нажмите кнопку Создать группу.
-
Укажите Имя группы:
ddos-sg-balancer
. -
Выберите Сеть
ddos-network
. -
В блоке Правила создайте следующие правила по инструкции под таблицей:
Направление
трафикаОписание Диапазон
портовПротокол Тип источника /
назначенияИсточник /
назначениеИсходящий any Весь Любой CIDR 0.0.0.0/0 Входящий ext-http 80 TCP CIDR 0.0.0.0/0 Входящий ext-https 443 TCP CIDR 0.0.0.0/0 Входящий healthchecks 30080 TCP Проверки состояния балансировщика — -
Выберите вкладку Исходящий трафик или Входящий трафик.
-
Нажмите кнопку Добавить правило.
-
В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик.
-
В поле Протокол укажите нужный протокол или оставьте Любой, чтобы разрешить передачу трафика по всем протоколам.
-
В поле Назначение или Источник выберите назначение правила:
- CIDR — правило будет применено к диапазону IP-адресов. В поле CIDR блоки укажите CIDR и маски подсетей, в которые или из которых будет поступать трафик. Чтобы добавить несколько CIDR, нажимайте кнопку Добавить CIDR.
- Группа безопасности — правило будет применено к ВМ из текущей группы или из выбранной группы безопасности.
- Проверки состояния балансировщика — правило, которое позволяет балансировщику проверять состояние ВМ.
-
Нажмите кнопку Сохранить. Таким образом создайте все правила из таблицы.
-
-
Нажмите кнопку Сохранить.
-
-
Аналогично создайте группу безопасности для ВМ с именем
ddos-sg-vms
, той же сетьюddos-network
и следующими правилами:Направление
трафикаОписание Диапазон
портовПротокол Тип источника Источник Входящий balancer 80 TCP Группа безопасности ddos-sg-balancer
Входящий ssh 22 TCP CIDR 0.0.0.0/0
Чтобы создать группу безопасности для балансировщика, выполните команду:
yc vpc security-group create \
--name ddos-sg-balancer \
--rule "direction=egress,port=any,protocol=any,v4-cidrs=[0.0.0.0/0]" \
--rule "direction=ingress,port=80,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "direction=ingress,port=443,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "direction=ingress,port=30080,protocol=tcp,predefined=loadbalancer_healthchecks" \
--network-name ddos-network
Чтобы создать группу безопасности для ВМ, выполните команду:
yc vpc security-group create \
--name ddos-sg-vms \
--rule "direction=ingress,port=22,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "direction=ingress,port=80,protocol=tcp,security-group-id=<идентификатор группы безопасности ddos-sg-balancer>" \
--network-name ddos-network
Подробнее о команде yc vpc security-group create
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте группу ВМ
На ВМ из целевой группы развертываются бэкенды вашего приложения. Целевая группа будет подключена к балансировщику, чтобы на эндпоинты бэкендов вашего приложения можно было направлять запросы. В этом сценарии достаточно создать группу ВМ с минимальной конфигурацией.
Чтобы создать группу ВМ:
-
В консоли управления выберите сервис Compute Cloud.
-
Откройте вкладку Группы виртуальных машин и нажмите кнопку Создать группу.
-
В блоке Базовые параметры:
- Введите Имя группы ВМ:
ddos-group
. - Выберите сервисный аккаунт из списка или создайте новый. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту роль
editor
. По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта.
- Введите Имя группы ВМ:
-
В блоке Распределение выберите несколько зон доступности, чтобы обеспечить отказоустойчивость хостинга.
-
В блоке Шаблон виртуальной машины нажмите кнопку Задать и укажите конфигурацию базовой ВМ:
-
В блоке Базовые параметры введите Описание шаблона.
-
В блоке Выбор образа/загрузочного диска откройте вкладку Cloud Marketplace и нажмите кнопку Посмотреть больше. Выберите продукт LEMP и нажмите кнопку Использовать.
-
В блоке Диски укажите:
- Тип диска — HDD.
- Размер диска — 3 ГБ.
-
В блоке Вычислительные ресурсы укажите:
- Платформа — Intel Cascade Lake.
- vCPU — 2.
- Гарантированная доля vCPU — 5%.
- RAM — 1 ГБ.
-
В блоке Сетевые настройки:
- Выберите облачную сеть
ddos-network
и ее подсети. - В поле Публичный адрес выберите Автоматически.
- Выберите группу безопасности
ddos-sg-vms
.
- Выберите облачную сеть
-
В блоке Доступ укажите данные для доступа на виртуальную машину:
- В поле Логин введите имя пользователя.
- В поле SSH-ключ вставьте содержимое файла открытого ключа.
Для подключения по SSH необходимо создать пару ключей. Подробнее в разделе Создание пары ключей SSH.
-
Нажмите кнопку Сохранить.
-
-
В блоке Масштабирование укажите Размер группы ВМ — 2.
-
В блоке Интеграция с Application Load Balancer выберите опцию Создать целевую группу и укажите имя группы:
tg-ddos
. Подробнее о целевых группах. -
Нажмите кнопку Создать.
-
Получите идентификаторы ресурсов, необходимые для создания группы ВМ, с помощью команд:
- yc iam service-account get <имя сервисного аккаунта> — для сервисного аккаунта;
- yc vpc network get ddos-network — для сети
ddos-network
; - yc vpc subnet get <имя подсети> — для подсетей
ddos-network-ru-a
,ddos-network-ru-b
иddos-network-ru-c
; - yc compute image get-latest-by-family lemp --folder-id standard-images — для образа загрузочного диска;
- yc vpc security-group get ddos-sg-vms — для группы безопасности
ddos-sg-vms
.
-
Создайте YAML-файл с именем
specification.yaml
. -
Добавьте в него описание конфигурации базовой виртуальной машины:
name: ddos-group service_account_id: <идентификатор сервисного аккаунта> description: "DDoS alb scenario" instance_template: platform_id: standard-v3 resources_spec: memory: 1g cores: 2 core_fraction: 5 boot_disk_spec: mode: READ_WRITE disk_spec: image_id: <идентификатор образа> type_id: network-hdd size: 3g network_interface_specs: - network_id: <идентификатор облачной сети> subnet_ids: - <идентификатор подсети в зоне ru-central1-a> - <идентификатор подсети в зоне ru-central1-b> - <идентификатор подсети в зоне ru-central1-c> primary_v4_address_spec: {} security_group_ids: - <идентификатор группы безопасности ddos-sg-vms> deploy_policy: max_unavailable: 1 max_expansion: 0 scale_policy: fixed_scale: size: 2 allocation_policy: zones: - zone_id: ru-central1-a - zone_id: ru-central1-b - zone_id: ru-central1-c application_load_balancer_spec: target_group_spec: name: tg-ddos
-
Создайте группу виртуальных машин в каталоге по умолчанию:
yc compute instance-group create \ --file specification.yaml
Результат:
done (25s) id: cl1qjhlcdofg6rujs29d folder_id: b1g86q4m5vej8lkljme5 created_at: "2021-08-30T19:25:02.031Z" name: ddos-group description: DDoS scenario instance_template: platform_id: standard-v2 resources_spec: memory: "1073741824" cores: "2" core_fraction: "5" boot_disk_spec: mode: READ_WRITE disk_spec: type_id: network-hdd size: "3221225472" image_id: fd8r6kq84o7be9tm50ms network_interface_specs: - network_id: enp3srbi9u49pjvcejnb subnet_ids: - e9b17pi15695qc0mngl2 - e2lt87g1rligsso4ketj - b0c7kl8riq244aq2mfc1 primary_v4_address_spec: {} security_group_ids: - enpi08rif04dcugga5e3 scheduling_policy: {} scale_policy: fixed_scale: size: "2" deploy_policy: max_unavailable: "1" startup_duration: 0s strategy: PROACTIVE allocation_policy: zones: - zone_id: ru-central1-a - zone_id: ru-central1-b - zone_id: ru-central1-c load_balancer_state: {} managed_instances_state: target_size: "2" service_account_id: aje2stn6id9k43qk7n7l status: ACTIVE application_load_balancer_spec: target_group_spec: name: first-target-group application_load_balancer_state: target_group_id: ds78imh0ds2eluau7ojp
Подробнее о команде
yc compute instance-group create
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
Зарезервируйте статический публичный IP-адрес
Примечание
Этот шаг нельзя выполнить через интерфейс командной строки (CLI).
Чтобы защитить балансировщик от DDoS-атак, необходимо зарезервировать для него статический публичный IP-адрес с опцией Защита от DDoS:
- В консоли управления выберите сервис Virtual Private Cloud.
- Откройте вкладку IP-адреса и нажмите кнопку Зарезервировать адрес.
- Выберите зону доступности, в которой нужно зарезервировать адрес.
- Включите опцию Защита от DDoS.
- Нажмите кнопку Зарезервировать.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте группу бэкендов
Целевую группу, созданную вместе с группой ВМ, нужно привязать к группе бэкендов с настройками распределения трафика.
Для бэкендов в группах будут созданы проверки состояния: балансировщик будет периодически отправлять проверочные запросы к ВМ и ожидать ответа в течение определенного периода.
Чтобы создать группу бэкендов:
- В консоли управления выберите сервис Application Load Balancer.
- Откройте вкладку Группы бэкендов. Нажмите кнопку Создать группу бэкендов.
- Укажите Имя группы бэкендов:
ddos-backend-group
. - В блоке Бэкенды нажмите кнопку Добавить.
- Укажите Имя бэкенда:
backend-1
. - В поле Целевая группа выберите группу
tg-ddos
. - Укажите Порт, на котором ВМ бэкенда будут принимать входящий трафик от балансировщика:
80
. - Нажмите кнопку Добавить проверку состояния.
- Укажите Порт, на котором ВМ бэкенда будут принимать проверочные соединения:
80
. - Укажите Путь, к которому будет обращаться балансировщик при проверке состояния:
/
. - Нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте группу бэкендов:
yc alb backend-group create ddos-backend-group
Результат:
id: a5dg2cv4ngne8575fb1p name: ddos-backend-group folder_id: aoerb349v3h4bupphtaf created_at: "2021-08-08T20:46:21.688940670Z"
Подробнее о команде
yc alb backend-group create
читайте в справочнике CLI. -
Добавьте в группу бэкенд и проверку состояния:
yc alb backend-group add-http-backend \ --backend-group-name ddos-backend-group \ --name backend-1 \ --weight 1 \ --port 80 \ --target-group-id=<идентификатор целевой группы> \ --http-healthcheck timeout=1s,interval=1s,port=80,path=/
Где:
--backend-group-name
— имя группы бэкендов.--name
— имя бэкенда.--weight
— вес бэкенда.--port
— порт.--target-group-id
— идентификатор целевой группы.--http-healthcheck
— параметры проверки состояния ресурсов.port
— порт.timeout
— таймаут.interval
— интервал.host
— адрес хоста.path
— путь.
Результат:
done (21s) id: ds7fea2pggr2e2vlncd5 name: ddos-backend-group folder_id: b1g86q4m5vej8lkljme5 http: backends: - name: backend-1 backend_weight: "1" port: "80" target_groups: target_group_ids: - ds78ate00f8e7c0p1rem healthchecks: - timeout: 1s interval: 1s healthcheck_port: "80" http: path: / created_at: "2021-08-08T07:59:22.922603189Z"
Подробнее о команде
yc alb backend-group add-http-backend
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте HTTP-роутер
Группу бэкендов нужно привязать к HTTP-роутеру с правилами маршрутизации HTTP-запросов.
Чтобы создать HTTP-роутер и добавить в него маршрут:
- В консоли управления выберите сервис Application Load Balancer.
- Откройте вкладку HTTP-роутеры. Нажмите кнопку Создать HTTP-роутер.
- Укажите Имя HTTP-роутера:
ddos-router
. - Нажмите кнопку Добавить виртуальный хост.
- Укажите Имя виртуального хоста:
ddos-host
. - Укажите значение Authority:
alb-with-ddos.com
. - Нажмите кнопку Добавить маршрут.
- Введите Имя:
route-1
. - В поле Путь выберите
Начинается с
и укажите путь/
. - В поле Действие оставьте
Маршрутизация
. - В списке Группа бэкендов выберите созданную ранее группу.
- Остальные настройки оставьте без изменений и нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Выполните команду:
yc alb http-router create ddos-router
Результат:
id: a5dcsselagj4o2v4a6e7 name: ddos-router folder_id: aoerb349v3h4bupphtaf created_at: "2021-08-08T21:04:59.438292069Z"
Подробнее о команде
yc alb http-router create
читайте в справочнике CLI. -
Создайте виртуальный хост, указав имя HTTP-роутера:
yc alb virtual-host create ddos-host \ --http-router-name ddos-router --authority alb-with-ddos.com
Подробнее о команде
yc alb virtual-host create
читайте в справочнике CLI. -
Добавьте маршрут, указав имя роутера и параметры маршрутизации:
yc alb virtual-host append-http-route route-1 \ --virtual-host-name ddos-host \ --http-router-name ddos-router \ --prefix-path-match / \ --backend-group-name ddos-backend-group \ --request-timeout 60s
Результат:
done (1s) name: ddos-host routes: - name: route-1 http: match: path: prefix_match: / route: backend_group_id: ds7fea2pggr2e2vlncd5 timeout: 60s
Подробнее о команде
yc alb virtual-host append-http-route
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте балансировщик
Чтобы создать балансировщик:
-
В консоли управления выберите сервис Application Load Balancer.
-
В меню слева выберите Балансировщики.
-
Нажмите кнопку Создать L7-балансировщик.
-
Введите имя балансировщика:
ddos-protect-alb
. -
В блоке Сетевые настройки выберите сеть
ddos-network
и группу безопасностиddos-sg-balancer
. -
В блоке Размещение выберите подсети для узлов балансировщика в каждой зоне доступности и включите передачу трафика.
-
В блоке Обработчики нажмите кнопку Добавить обработчик. Задайте настройки обработчика:
- Введите имя обработчика:
ddos-listener
. - В блоке Настройки публичного IP-адреса включите передачу трафика.
- Укажите порт
80
. - Выберите тип Список и укажите зарезервированный ранее адрес с защитой от DDoS.
- Введите имя обработчика:
-
В поле HTTP-роутер выберите
ddos-router
. -
Нажмите кнопку Создать.
-
Создайте балансировщик с узлами в подсетях облачной сети:
yc alb load-balancer create ddos-protect-alb \ --network-name ddos-network \ --location subnet-name=ddos-network-ru-a,zone=ru-central1-a \ --location subnet-name=ddos-network-ru-b,zone=ru-central1-b \ --location subnet-name=ddos-network-ru-c,zone=ru-central1-c
Подробнее о команде
yc alb load-balancer create
читайте в справочнике CLI. -
Добавьте обработчик:
yc alb load-balancer add-listener ddos-protect-alb \ --listener-name ddos-listener \ --http-router-id <идентификатор HTTP-роутера> \ --external-ipv4-endpoint port=80, address=<IP-адрес с защитой от DDoS>
Подробнее о команде
yc alb load-balancer add-listener
читайте в справочнике CLI.
См. раздел Как создать инфраструктуру с помощью Terraform.
Проверьте работу балансировщика
Проверьте доступность сервиса на хосте alb-with-ddos.com
. Для этого выполните команду:
curl -H "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>
Удалите созданные ресурсы
Чтобы остановить работу хостинга и перестать платить за созданные ресурсы:
-
Удалите нетарифицируемые ресурсы, которые блокируют удаление тарифицируемых ресурсов:
-
Удалите группу виртуальных машин
ddos-group
. -
Удалите зарезервированный статический публичный адрес.
Как создать инфраструктуру с помощью Terraform
Terraform позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). Terraform и его провайдеры распространяются под лицензией Mozilla Public License.
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform или в зеркале.
При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.
Чтобы создать L7-балансировщик с защитой от DDoS-атак с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файл с описанием инфраструктуры:
Готовый архивСоздание вручную- Создайте папку для файла с описанием инфраструктуры.
- Скачайте архив (3 КБ).
- Разархивируйте архив в папку. В результате в ней должны появиться конфигурационный файл
alb-with-ddos-protection.tf
и файл с пользовательскими даннымиalb-with-ddos-protection.auto.tfvars
.
-
Создайте папку для файла с описанием инфраструктуры.
-
Создайте в папке конфигурационный файл
alb-with-ddos-protection.tf
:Содержимое файла alb-with-ddos-protection.tfvariable "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_binding" "editor" { folder_id = var.folder_id role = "editor" members = [ "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 } } } }
-
Создайте в папке файл с пользовательскими данными
alb-with-ddos-protection.auto.tfvars
:Содержимое файла alb-with-ddos-protection.auto.tfvarsfolder_id = "<идентификатор_каталога>" vm_user = "<имя_пользователя_ВМ>" ssh_key_path = "<путь_к_публичному_SSH-ключу>"
Примечание
В конфигурационном файле используются группы безопасности, они находятся на стадии Preview. Запросите в технической поддержке доступ к этой функции или удалите в конфигурационном файле блоки ресурсов
yandex_vpc_security_group
и строки с параметрамиsecurity_group_ids
.Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
-
В файле
alb-with-ddos-protection.auto.tfvars
задайте пользовательские параметры:folder_id
— идентификатор каталога.vm_user
— имя пользователя ВМ.ssh_key_path
— путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ. Подробнее см. Создание пары ключей SSH.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-