Создать облачный балансировщик нагрузки
Мы рекомендуем создавать ресурсы по порядку. Если вы создаете все ресурсы единовременно, Terraform будет учитывать зависимости между ресурсами, которые вы указали в конфигурационном файле. Если зависимости не указаны, ресурсы будут создаваться параллельно, что может приводить к ошибкам. Например, ресурс, который требуется для создания другого ресурса, может быть еще не создан.
- Опционально: настройте провайдеры.
- Создайте приватную сеть и подсеть.
- Создайте облачный роутер, подключенный к внешней сети.
- Создайте облачный балансировщик нагрузки.
- Создайте правило.
- Создайте целевую группу.
- Добавьте сервер в целевую группу.
- Создайте проверку доступности.
- Создайте публичный IP-адрес и подключите его к балансировщику нагрузки.
- Получите IP-адрес балансировщика нагрузки.
Конфигурационные файлы
Пример файла для настройки провайдеров
terraform {
  required_providers {
    selectel  = {
      source  = "selectel/selectel"
      version = "~> 6.0"
    }
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "2.1.0"
    }
  }
}
provider "selectel" {
  domain_name = "123456"
  username    = "user"
  password    = "password"
  auth_region = "ru-9"
  auth_url    = "https://cloud.api.selcloud.ru/identity/v3/"
}
resource "selectel_vpc_project_v2" "project_1" {
  name = "project"
}
resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
  name         = "username"
  password     = "password"
  role {
    role_name  = "member"
    scope      = "project"
    project_id = selectel_vpc_project_v2.project_1.id 
  }
}
provider "openstack" {
  auth_url    = "https://cloud.api.selcloud.ru/identity/v3"
  domain_name = "123456"
  tenant_id   = selectel_vpc_project_v2.project_1.id
  user_name   = selectel_iam_serviceuser_v1.serviceuser_1.name
  password    = selectel_iam_serviceuser_v1.serviceuser_1.password
  region      = "ru-9"
}
Пример файла для создания балансировщика нагрузки
resource "openstack_networking_network_v2" "network_1" {
  name           = "private-network"
  admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
  name       = "private-subnet"
  network_id = openstack_networking_network_v2.network_1.id
  cidr       = "192.168.199.0/24"
}
data "openstack_networking_network_v2" "external_network_1" {
  external = true
}
resource "openstack_networking_router_v2" "router_1" {
  name                = "router"
  external_network_id = data.openstack_networking_network_v2.external_network_1.id
}
resource "openstack_networking_router_interface_v2" "router_interface_1" {
  router_id = openstack_networking_router_v2.router_1.id
  subnet_id = openstack_networking_subnet_v2.subnet_1.id
}
resource "openstack_lb_loadbalancer_v2" "load_balancer_1" {
  name          = "load-balancer"
  vip_subnet_id = openstack_networking_subnet_v2.subnet_1.id
  flavor_id     = "ac18763b-1fc5-457d-9fa7-b0d339ffb336"
}
resource "openstack_lb_listener_v2" "listener_1" {
  name            = "listener"
  protocol        = "TCP"
  protocol_port   = "80"
  loadbalancer_id = openstack_lb_loadbalancer_v2.load_balancer_1.id
}
resource "openstack_lb_pool_v2" "pool_1" {
  name        = "pool"
  protocol    = "PROXY"
  lb_method   = "ROUND_ROBIN"
  listener_id = openstack_lb_listener_v2.listener_1.id
}
resource "openstack_lb_member_v2" "member_1" {
  name          = "member"
  subnet_id     = openstack_networking_subnet_v2.subnet_1.id
  pool_id       = openstack_lb_pool_v2.pool_1.id
  address       = "192.168.199.4"
  protocol_port = "80"
}
resource "openstack_lb_monitor_v2" "monitor_1" {
  name        = "monitor"
  pool_id     = openstack_lb_pool_v2.pool_1.id
  type        = "HTTP"
  delay       = "10"
  timeout     = "4"
  max_retries = "5"
}
resource "openstack_networking_floatingip_v2" "floatingip_1" {
  pool    = "external-network"
  port_id = openstack_lb_loadbalancer_v2.load_balancer_1.vip_port_id
}
output "public_ip_address" {
  value = openstack_networking_floatingip_v2.floatingip_1.fixed_ip
}
1. Опционально: настроить провайдеры
Если вы настроили провайдеры Selectel и OpenStack, пропустите этот шаг.
- 
Убедитесь, что в панели управления вы создали сервисного пользователя с ролями memberв области доступа Аккаунт иiam_admin.
- 
Создайте директорию для хранения конфигурационных файлов и отдельный файл с расширением .tfдля настройки провайдеров.
- 
В файл для настройки провайдеров добавьте провайдеры Selectel и OpenStack: terraform {
 required_providers {
 selectel = {
 source = "selectel/selectel"
 version = "~> 6.0"
 }
 openstack = {
 source = "terraform-provider-openstack/openstack"
 version = "2.1.0"
 }
 }
 }Здесь version— версии провайдеров. Актуальную версию можно посмотреть в документации Selectel (в Terraform Registry и GitHub) и OpenStack (в Terraform Registry и GitHub).Подробнее о продуктах, услугах и сервисах, которыми можно управлять с помощью провайдеров, в инструкции Провайдеры Selectel и OpenStack. 
- 
Инициализируйте провайдер Selectel: provider "selectel" {
 domain_name = "123456"
 username = "user"
 password = "password"
 auth_region = "ru-9"
 auth_url = "https://cloud.api.selcloud.ru/identity/v3/"
 }Здесь: - domain_name— номер аккаунта Selectel. Можно посмотреть в панели управления в правом верхнем углу;
- username— имя сервисного пользователя с ролями- memberв области доступа Аккаунт и- iam_admin. Можно посмотреть в панели управления: в верхнем меню нажмите Аккаунт → раздел Сервисные пользователи (раздел доступен только Владельцу аккаунта и пользователю с ролью- iam_admin);
- password— пароль сервисного пользователя. Можно посмотреть при создании пользователя или изменить на новый;
- auth_region— пул для авторизации, например- ru-9. Создавать ресурсы можно в других пулах. Список доступных пулов можно посмотреть в инструкции Матрицы доступности.
 
- 
Создайте проект: resource "selectel_vpc_project_v2" "project_1" {
 name = "project"
 }Посмотрите подробное описание ресурса selectel_vpc_project_v2. 
- 
Создайте сервисного пользователя для доступа к проекту и назначьте ему роль memberв области доступа Проект:resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
 name = "username"
 password = "password"
 role {
 role_name = "member"
 scope = "project"
 project_id = selectel_vpc_project_v2.project_1.id
 }
 }Здесь: - username— имя пользователя;
- password— пароль пользователя. Пароль должен быть не короче восьми символов и содержать латинские буквы разных регистров и цифры;
- project_id— ID проекта. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты и выберите Облачные серверы → откройте меню проектов → в строке нужного проекта нажмите .
 Посмотрите подробное описание ресурса selectel_iam_serviceuser_v1. 
- 
Инициализируйте провайдер OpenStack: provider "openstack" {
 auth_url = "https://cloud.api.selcloud.ru/identity/v3"
 domain_name = "123456"
 tenant_id = selectel_vpc_project_v2.project_1.id
 user_name = selectel_iam_serviceuser_v1.serviceuser_1.name
 password = selectel_iam_serviceuser_v1.serviceuser_1.password
 region = "ru-9"
 }Здесь: - domain_name— номер аккаунта Selectel. Можно посмотреть в панели управления в правом верхнем углу;
- region— пул, например- ru-9. Все ресурсы будут создаваться в этом пуле. Список доступных пулов можно посмотреть в инструкции Матрицы доступности.
 
- 
Если одновременно с настройкой провайдеров вы создаете ресурсы, то для ресурсов OpenStack добавьте аргумент depends_on. Например, для ресурса openstack_networking_network_v2:resource "openstack_networking_network_v2" "network_1" {
 name = "private-network"
 admin_state_up = "true"
 depends_on = [
 selectel_vpc_project_v2.project_1,
 selectel_iam_serviceuser_v1.serviceuser_1
 ]
 }
- 
Опционально: если вы хотите использовать зеркало, создайте отдельный конфигурационный файл Terraform CLI и добавьте в него блок: provider_installation {
 network_mirror {
 url = "https://tf-proxy.selectel.ru/mirror/v1/"
 include = ["registry.terraform.io/*/*"]
 }
 direct {
 exclude = ["registry.terraform.io/*/*"]
 }
 }Подробнее о настройках зеркал в инструкции CLI Configuration File документации HashiCorp. 
- 
Откройте CLI. 
- 
Инициализируйте конфигурацию Terraform в директории: terraform init
- 
Проверьте, что конфигурационные файлы составлены без ошибок: terraform validate
- 
Отформатируйте конфигурационные файлы: terraform fmt
- 
Проверьте, какие ресурсы будут созданы: terraform plan
- 
Примените изменения и создайте ресурсы: terraform apply
- 
Подтвердите создание — введите yes и нажмите Enter. Созданные ресурсы отобразятся в панели управления. 
- 
Если для создания ресурсов оказалось недостаточно квот, увеличьте квоты. 
2. Создать приватную сеть и подсеть
resource "openstack_networking_network_v2" "network_1" {
  name           = "private-network"
  admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
  name       = "private-subnet"
  network_id = openstack_networking_network_v2.network_1.id
  cidr       = "192.168.199.0/24"
}
Здесь cidr — CIDR приватной подсети, например 192.168.199.0/24.
Посмотрите подробное описание ресурсов:
3. Создать облачный роутер, подключенный к внешней сети
Облачный роутер, подключенный к внешней сети, выполняет функцию 1:1 NAT для доступа из приватной сети в интернет через публичный IP-адрес роутера.
data "openstack_networking_network_v2" "external_network_1" {
  external = true
}
resource "openstack_networking_router_v2" "router_1" {
  name                = "router"
  external_network_id = data.openstack_networking_network_v2.external_network_1.id
}
resource "openstack_networking_router_interface_v2" "router_interface_1" {
  router_id = openstack_networking_router_v2.router_1.id
  subnet_id = openstack_networking_subnet_v2.subnet_1.id
}
Посмотрите подробное описание ресурсов:
- openstack_networking_network_v2;
- openstack_networking_router_v2;
- openstack_networking_router_interface_v2.
4. Создать облачный балансировщик нагрузки
resource "openstack_lb_loadbalancer_v2" "load_balancer_1" {
  name          = "load-balancer"
  vip_subnet_id = openstack_networking_subnet_v2.subnet_1.id
  flavor_id     = "ac18763b-1fc5-457d-9fa7-b0d339ffb336"
}
Здесь flavor_id — ID флейвора. Флейворы соответствуют типам балансировщика нагрузки  и определяют количество vCPU, RAM и количество инстансов балансировщика. Например, ac18763b-1fc5-457d-9fa7-b0d339ffb336 — ID для создания балансировщика с типом Продвинутый с резервированием в пуле ru-9. Список флейворов можно посмотреть в таблице Список флейворов балансировщика нагрузки во всех пулах.
Посмотрите подробное описание ресурса openstack_lb_loadbalancer_v2.
5. Создать правило
resource "openstack_lb_listener_v2" "listener_1" {
  name            = "listener"
  protocol        = "TCP"
  protocol_port   = "80"
  loadbalancer_id = openstack_lb_loadbalancer_v2.load_balancer_1.id
}
Здесь:
- protocol— протокол для балансировщика, например- TCP. Посмотрите доступные комбинации протоколов для балансировщика и сервера;
- protocol_port— порт входящего трафика для балансировщика.
Посмотрите подробное описание ресурса openstack_lb_listener_v2.
6. Создать целевую группу
resource "openstack_lb_pool_v2" "pool_1" {
  name        = "pool"
  protocol    = "PROXY"
  lb_method   = "ROUND_ROBIN"
  listener_id = openstack_lb_listener_v2.listener_1.id
}
Здесь:
- protocol— протокол для серверов, например- PROXY. Посмотрите доступные комбинации протоколов для балансировщика и сервера;
- lb_method— алгоритм распределения запросов. Доступны алгоритмы- ROUND_ROBINи- LEAST_CONNECTIONS.
Посмотрите подробное описание ресурса openstack_lb_pool_v2.
7. Добавить сервер в целевую группу
resource "openstack_lb_member_v2" "member_1" {
  name          = "member"
  subnet_id     = openstack_networking_subnet_v2.subnet_1.id
  pool_id       = openstack_lb_pool_v2.pool_1.id
  address       = "192.168.199.4"
  protocol_port = "80"
}
Здесь:
- address— приватный IP-адрес сервера, например- 192.168.199.4;
- protocol_port— порт для серверов в правиле.
Посмотрите подробное описание ресурса openstack_lb_member_v2.
8. Создать проверку доступности
resource "openstack_lb_monitor_v2" "monitor_1" {
  name        = "monitor"
  pool_id     = openstack_lb_pool_v2.pool_1.id
  type        = "HTTP"
  delay       = "10"
  timeout     = "4"
  max_retries = "5"
}
Здесь:
- type— тип проверки, например- HTTP;
- delay— интервал в секундах, с которым балансировщик отправляет проверяющие запросы серверам;
- timeout— таймаут соединения (время ожидания ответа);
- max_retries— количество успешных обращений подряд, после которых сервер переводится в рабочее состояние (порог успеха).
Посмотрите подробное описание ресурса openstack_lb_monitor_v2.
9. Создать публичный IP-адрес и подключить к балансировщику
Публичный IP-адрес будет подключен к порту балансировщика нагрузки и ассоциирован с приватным IP.
resource "openstack_networking_floatingip_v2" "floatingip_1" {
  pool    = "external-network"
  port_id = openstack_lb_loadbalancer_v2.load_balancer_1.vip_port_id
}
Посмотрите подробное описание ресурса openstack_networking_floatingip_v2.
10. Получить IP-адрес балансировщика нагрузки
output "public_ip_address" {
  value = openstack_networking_floatingip_v2.floatingip_1.fixed_ip
}