---
title: "Example of creating infrastructure with a load balancer via Terraform"
sidebar_label: "Example of creating infrastructure with a load balancer"
sidebar_position: 2
description: "Learn how to create a cloud load balancer and add a cloud server to a rule"
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import ConfigureProviders from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/common/configure-providers.mdx'
import ConfigureProvidersConfig from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/common/configure-providers-config.mdx'
import CreateRouter from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-networks/create-router.mdx'
import CreateNetworks from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-networks/create-networks.mdx'
import AddPublicSsh from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-servers/add-public-ssh-key.mdx'
import CreatePort from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-servers/create-port.mdx'
import GetImage from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-servers/get-image.mdx'
import CreateBalancer from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-load-balancers/create-balancer.mdx'
import CreateRule from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-load-balancers/create-rule.mdx'
import AddServerToTargetGroup from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-load-balancers/add-server-to-target-group.mdx'
import CreateAvailabilityCheck from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-load-balancers/create-availability-check.mdx'
import CreateTargetGroup from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-load-balancers/create-target-group.mdx'
import CreateBootVolume from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-servers/create-boot-volume.mdx'
import CreateFixedServerBootNetwork from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-servers/create-fixed-server-with-boot-network-volume.mdx'
import CreateResourcesAlert from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/common/create-resources-alert.mdx'
import GetIp from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-networks/get-ip.mdx'

# Example of creating infrastructure with a cloud load balancer via Terraform

<CreateResourcesAlert />

<br />

1. Optional: [configure providers](#configure-providers).
2. [Create a private network and a subnet](#create-networks).
3. [Create a cloud router connected to the internet](#create-router).
4. [Create a cloud server](#create-cloud-server).
5. [Create a cloud load balancer](#create-load-balancer).
6. [Create a public floating IP address and attach it to the load balancer](#create-public-floating-ip).
7. [Get the load balancer IP address](#get-ip).

## Configuration files \{#config}

<details>
  <summary>Example file for configuring providers</summary>

  <ConfigureProvidersConfig />
</details>

<details>
  <summary>Example file for creating infrastructure with a cloud load balancer</summary>

  ```hcl
  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 "selectel_vpc_keypair_v2" "keypair_1" {
    name       = "keypair"
    public_key = file("~/.ssh/id_rsa.pub")
    user_id    = selectel_iam_serviceuser_v1.serviceuser_1.id
  }

  resource "openstack_networking_port_v2" "port_1" {
    name       = "port"
    network_id = openstack_networking_network_v2.network_1.id

    fixed_ip {
      subnet_id = openstack_networking_subnet_v2.subnet_1.id
    }
  }

  data "openstack_images_image_v2" "image_1" {
    name        = "Ubuntu 20.04 LTS 64-bit"
    most_recent = true
    visibility  = "public"
  }

  resource "openstack_blockstorage_volume_v3" "volume_1" {
    name                 = "boot-volume-for-server"
    size                 = "5"
    image_id             = data.openstack_images_image_v2.image_1.id
    volume_type          = "fast.ru-9a"
    availability_zone    = "ru-9a"
    enable_online_resize = true

    lifecycle {
      ignore_changes = [image_id]
    }

  }

  resource "openstack_compute_instance_v2" "server_1" {
    name              = "server"
    flavor_id         = "4011"
    key_pair          = selectel_vpc_keypair_v2.keypair_1.name
    availability_zone = "ru-9a"

    network {
      port = openstack_networking_port_v2.port_1.id
    }

    lifecycle {
      ignore_changes = [image_id]
    }

    block_device {
      uuid             = openstack_blockstorage_volume_v3.volume_1.id
      source_type      = "volume"
      destination_type = "volume"
      boot_index       = 0
    }

    vendor_options {
      ignore_resize_confirmation = true
    }
  }

  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
  }
  ```
</details>

## 1. Optional: configure providers \{#configure-providers}

If you have [configured the Selectel and OpenStack providers](/terraform/configure-terraform-environment/#configure-providers), skip this step.

<ConfigureProviders />

## 2. Create a private network and subnet \{#create-networks}

<CreateNetworks />

## 3. Create a cloud router connected to the internet \{#create-router}

<CreateRouter />

## 4. Create a cloud server \{#create-cloud-server}

1. [Add a public SSH key](#add-public-ssh-key).
2. [Create a port for the cloud server](#create-port).
3. [Get an image](#get-image).
4. [Create a bootable network volume](#create-boot-volume).
5. [Create a cloud server](#create-server).

### 1. Add a public SSH key \{#add-public-ssh-key}

<AddPublicSsh />

### 2. Create a port for the cloud server \{#create-port}

<CreatePort />

### 3. Get an image \{#get-image}

<GetImage />

### 4. Create a bootable network volume \{#create-boot-volume}

<CreateBootVolume />

### 5. Create a cloud server \{#create-server}

<CreateFixedServerBootNetwork />

## 5. Create a cloud load balancer \{#create-load-balancer}

1. [Create a balancer](#create-balancer).
2. [Create a rule](#create-rule).
3. [Create a target group](#create-target-group).
4. [Add the server to the target group](#add-server-to-target-group).
5. [Create an availability check](#create-availability-check).

### 1. Create a cloud load balancer \{#create-balancer}

<CreateBalancer />

### 2. Create a rule \{#create-rule}

<CreateRule />

### 3. Create a target group \{#create-target-group}

<CreateTargetGroup />

### 4. Add the server to the target group \{#add-server-to-target-group}

<AddServerToTargetGroup />

### 5. Create an availability check \{#create-availability-check}

<CreateAvailabilityCheck />

## 6. Create a public floating IP address and attach to the load balancer \{#create-public-floating-ip}

The public floating IP address will be connected to the load balancer port and associated with the private IP.

```hcl
resource "openstack_networking_floatingip_v2" "floatingip_1" {
  pool    = "external-network"
  port_id = openstack_lb_loadbalancer_v2.load_balancer_1.vip_port_id
}
```

See the detailed description of the [openstack\_networking\_floatingip\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_floatingip_v2/) resource.

## 7. Get the load balancer IP address \{#get-ip}

<GetIp />

<Formbricks />
