Создание L7-балансировщика с защитой от DDoS с помощью Terraform
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
Чтобы создать балансировщик с защитой от DDoS c помощью Terraform:
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице 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
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Чтобы создайть инфраструктуру с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файл с описанием инфраструктуры:
Готовая конфигурацияВручную-
Склонируйте репозиторий с конфигурационными файлами:
git clone https://github.com/yandex-cloud-examples/yc-alb-ddos-protection.git
-
Перейдите в директорию с репозиторием. В ней должны появиться файлы:
alb-with-ddos-protection.tf
— конфигурация создаваемой инфраструктуры.alb-with-ddos-protection.auto.tfvars
— пользовательские данные.
-
Создайте папку для файла с описанием инфраструктуры.
-
Создайте в папке конфигурационный файл
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 } } } }
-
Создайте в папке файл с пользовательскими данными
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
.
-
-
В файле
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.
-
После создания инфраструктуры, проверьте его работу.
Проверьте работу балансировщика
Проверьте доступность сервиса на хосте 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>
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
tls-termination-config.tf
и удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-