---
title: "Добавить правило балансировщика через Terraform — Timeweb Cloud"
description: "Добавить правило балансировщика через Terraform. Практические руководства для IT-специалистов. В Timeweb Cloud вы можете найти необходимую инструкцию или стать автором. Участвуйте в нашей контент-программе и внесите свой вклад в развитие сообщества."
---

# Как добавить правило балансировщика через Terraform

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

Terraform — это инструмент для управления инфраструктурой с помощью кода, созданный компанией HashiCorp. С его помощью можно автоматизировать создание и изменение ресурсов инфраструктуры с использованием декларативного языка конфигурации HCL.

Возможности Terraform:

-   Управление инфраструктурой с помощью единого инструмента
-   Контроль версий и повторное использование конфигураций
-   Возможность отслеживать текущее состояние инфраструктуры

В инструкции рассмотрим, как управлять правилами балансировщика нагрузки с помощью Terraform.

## Зачем нужен балансировщик?

Сетевой балансировщик дает возможность равномерно распределить входящий трафик по нескольким серверам для улучшения доступности и надежности вашего сервиса. Он является незаменимым инструментом при реализации горизонтального масштабирования сервисов.

Горизонтальное масштабирование — это процесс добавления дополнительных узлов или машин к существующей инфраструктуре для увеличения её возможностей и обработки большего количества трафика.

Основные преимущества, которые предоставляет балансировщик:

-   Балансировка нагрузки для TCP-сессий, обеспечивающая оптимальное использование ресурсов серверов.
-   Поддержка различных протоколов HTTP, HTTP2, HTTPS, TCP.
-   Отказоустойчивость сервера приложений, позволяющая избежать проблем с доступностью и работоспособностью сервиса.
-   Возможность настраивать правила маршрутизации трафика, чтобы направлять запросы к определенным портам на серверах.
-   Возможность настройки SSL и переадресации на протокол HTTPS.

## Создаем сетевой балансировщик

Для начала определимся с требованиями к балансировщику нагрузки:

1.  У нас будет два сервера, у которых на 80-м порту будет развернут сайт.
2.  Обращаясь по 80 порту к адресу балансировщика, мы должны будем попадать на наш сайт, на один из серверов.
3.  Алгоритм — Round robin.
4.  Дополнительных параметров нет.

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

Мы добавили два сервера для того, чтобы настроить для них балансировку нагрузки.

![Image5](https://content.timeweb.com/assets/6bb8b154-adf1-432c-910c-705a29ad0b86?width=325&height=213)

Теперь добавим проект на terraform. Подробнее об установке и настройке провайдера можно прочитать [тут](https://timeweb.cloud/docs/terraform/nachalo-raboty-s-terraform). 

Сначала необходимо создать папку, где будут находиться конфигурации:

```shell
mkdir timeweb-lb
cd timeweb-lb
```

Общая структура файлов получилась следующей:

```shell
├── timeweb-lb
│   ├── main.tf
│   ├── variables.tf
```

В файле `variables.tf` укажем переменные для токена провайдера и IP-адресов для балансировки:

```shell
variable "tw_token" {
  type = string
  sensitive = true
}

variable "lb-ips" {
    type = set(string)
}
```

В файле `main.tf` добавим информацию о провайдере:

```shell
terraform {
  required_providers {
    twc = {
        source = "tf.timeweb.cloud/timeweb-cloud/timeweb-cloud"
    }
  }
  required_version = ">= 1.5.3"
}

provider "twc" {
  token = var.tw_token
}
```

Когда мы описываем конфигурацию Terraform, мы используем два основных типа сущностей — это источники данных (`data`) и ресурсы (`resources`).

-   Источники данных предназначены для того, чтобы определять различные переменные и настройки, которые доступны в рамках выбранного провайдера. К таким источникам данных могут относиться, например, пресеты, проекты и другие параметры.
-   Ресурсы — это те элементы инфраструктуры, которые мы хотим создать с помощью Terraform — например, серверы, базы данных, балансировщики нагрузки и другие компоненты.

В файле `main.tf` укажем пресет для настройки:

```shell
data "twc_lb_preset" "lb-preset" {
  requests_per_second = "10K"
  price_filter {
    from = 100
    to = 200
  }
}
```

Если в [панели управления](https://timeweb.cloud/my/projects/) вы используете проекты, то можно указать конкретный проект, в котором будут созданы ресурсы. Например, добавим проект с названием «Articles»:

```shell
data "twc_projects" "articles" {
  name = "Articles"
}
```

Ресурс, который мы будем создавать, называется `twc_lb`. При его создании мы можем указать множество опциональных параметров, например настройки healthcheck, выбор алгоритма балансировки. Возьмем самую простую настройку:

```shell
resource "twc_lb" "load-balancer" {
    name = "load-balancer"
    algo = "roundrobin"

    project_id = data.twc_projects.articles.id
    preset_id = data.twc_lb_preset.lb-preset.id
```

Вот какие параметры мы можем еще указать:

-   `ips` — список IP-адресов для балансировки
-   `is_keepalive` — флаг, который указывает на поддержание TCP-соединения с сервером
-   `is_ssl` — автоматический редирект на протокол HTTPS
-   `is_sticky` — сохранять пользовательскую сессию для одного бэкэнд-сервера

Также в проект мы добавили файл `.tfvars`, где указали значения переменных из `variables.tf`:

```shell
tw_token = "<тут api key для провайдера>"
lb-ips = [ "<тут ip-адрес для первого сервера>", "<тут — для второго>" ]
```

Далее выполним команду:

```shell
terraform validate
```

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

![Image1](https://content.timeweb.com/assets/f2d5fb45-1a13-4e7f-84f3-7e84aeacc43c?width=616&height=73)

Теперь можно выполнить следующую команду, чтобы посмотреть, какие ресурсы будут созданы:

```shell
terraform plan -var-file=.tfvars
```

Флаг `-var-file=.tfvars` позволяет нам указать на файл с переменными, которые необходимо будет подставить при применении этого кода.

![Image8](https://content.timeweb.com/assets/43ccbb4f-623f-48f4-b596-799da0fd9447?width=678&height=537)

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

1.  С помощью параметра `-var`, например `-var="tw_token=243453452345235456643"`
2.  C помощью переменных окружения —  
    `export TF_VAR_tw_token=243453452345235456643`

## Добавляем правила к балансировщику

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

1.  Порт, на который мы будем обращаться по адресу балансировщика.
2.  Порт, на который мы будем перенаправляться на конкретных серверах.

Добавим новый ресурс в нашу конфигурацию, в файл `main.tf`:

```shell
resource "twc_lb_rule" "lb-rule" {
  lb_id = resource.twc_lb.load-balancer.id
  balancer_proto = "http"
  balancer_port = 80
  server_proto = "http"
  server_port = 80
}
```

Снова выполним команды:

```shell
terraform validate
```

```shell
terraform plan -var-file=.tfvars
```

```shell
terraform apply -var-file=.tfvars
```

Подтвердим применение команды, введя `yes`.

![Image2](https://content.timeweb.com/assets/dc074089-d13c-4097-883a-394de0855215?width=543&height=281)

В панели управления видим созданные ресурсы:

-   Балансировщик

![830daf03 83ea 443c 939b 0187dd70a249](https://content.timeweb.com/assets/0dde03ae-3805-42c0-9182-9e71ff8bd6eb?width=958&height=242)

-   Правило

![Image10](https://content.timeweb.com/assets/3a20d7ff-c654-4451-bc4d-4e065686fbee?width=626&height=460)

Перейдем по адресу нашего балансировщика (два раза, чтобы попасть на разные серверы):

-   Первый сервер, указанный в переменных:

![Image3](https://content.timeweb.com/assets/622d9eee-c700-4a65-83f4-242d9c51a991?width=472&height=226)

-   Второй сервер, указанный в переменных:

![Image6](https://content.timeweb.com/assets/1271de9b-f5b9-40f8-81df-34877b5d2ec4?width=475&height=260)

Что делать, если нам потребовалось добавить второе правило? Например, на серверах мы развернули новое приложение на порту 81.

Просто добавим еще один блок `resource` для правила:

```shell
resource "twc_lb_rule" "lb-second-rule" {
  # таким образом мы укажем идентификатор балансировщика, созданного ранее
  lb_id = resource.twc_lb.load-balancer.id
  balancer_proto = "http"
  balancer_port = 81
  server_proto = "http"
  server_port = 81
}
```

Снова выполним команду ниже, чтобы посмотреть на изменения:

```shell
terraform plan -var-file=.tfvars
```

![Image4](https://content.timeweb.com/assets/ed6b1c07-70f1-40fa-9ef4-bdf30db7c027?width=993&height=469)

Мы видим информацию о том, что один балансировщик и одно правило уже созданы, а новое правило будет добавлено. 

Выполним команду:

```shell
terraform apply -var-file=.tfvars
```

При запросе согласимся на применение конфигурации:

![Image9](https://content.timeweb.com/assets/86398b87-cace-496b-95d0-a70e12baa2f7?width=506&height=211)

Теперь заглянем в панель управления — у нас настроены два правила:

![Image11](https://content.timeweb.com/assets/269094ad-2a56-426d-bb60-e12883b2ec20?width=602&height=662)

Обратимся по адресу балансировщика, чтобы проверить, что всё работает корректно:

![Image12](https://content.timeweb.com/assets/2a4bbf30-813b-4144-99b7-b14089217e48?width=438&height=214)

## Заключение

В этой статье мы научились создавать сетевые балансировщики и правила с помощью Terraform. Помимо использования этого инструмента, балансировщиками можно управлять с помощью [CLI](https://github.com/timeweb-cloud/twc/blob/master/docs/ru/CLI_REFERENCE.md) и [API](https://timeweb.cloud/api-docs#tag/Balansirovshiki).

Все примеры из статьи доступны на [Гитхабе](https://github.com/DmitryBahtenkov/timeweb-load-balancer).

Полезные ссылки:

-   [Документация терраформ-провайдера Timeweb Cloud](https://github.com/timeweb-cloud/terraform-provider-timeweb-cloud)
-   [Документация Terraform CLI](https://developer.hashicorp.com/terraform/cli/run)
-   [Синтаксис Terraform](https://developer.hashicorp.com/terraform/language/syntax/configuration)
