Облачная платформаEvolution

Создание VPC, Magic Router и настройка маршрутизации с помощью Terraform


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

Схема сетевой связности

Вы будете использовать следующие сервисы:

  • Terraform — сервис для декларативного управления инфраструктурой с помощью конфигурационных файлов.

  • VPC — изолированная виртуальная сеть для создания безопасной инфраструктуры.

  • Magic Router — сервис для управления сетевыми связями между ресурсами внутри облачной инфраструктуры.

  • «Группы безопасности» — сервис для контроля трафика виртуальных машин.

  • «Виртуальные машины» — сервис, в рамках которого предоставляется виртуальная машина.

Примечание

Для успешного выполнения сценария используйте версию провайдера Terraform 2.0.0.

Шаги:

  1. Подготовьте Terraform.

  2. Настройте конфигурационный файл.

  3. Проверьте сетевую связность.

Перед началом работы

  1. Зарегистрируйтесь в личном кабинете Cloud.ru.

    Если вы уже зарегистрированы, войдите под своей учетной записью.

  2. Получите идентификатор проекта.

  3. В личном кабинете получите идентификаторы групп безопасности SSH-access_ru.AZ-1, SSH-access_ru.AZ-2.

1. Подготовьте Terraform

  1. Установите и настройте Terraform.

  2. Создайте папку для проекта и проинициализируйте провайдер командой:

    terraform init

2. Настройте конфигурационный файл

  1. В папке проекта создайте конфигурационный файл cloudru_evolution_vpc_vpc.tf.

  2. В файле укажите следующие параметры:

    # Создание vpc-1
    resource "cloudru_evolution_vpc_vpc" "resource_vpc1" {
    name = "vpc-1"
    project_id = "<project_id>" # Укажите идентификатор проекта
    description = "First VPC"
    }
    # Создание vpc-2
    resource "cloudru_evolution_vpc_vpc" "resource_vpc2" {
    name = "vpc-2"
    project_id = "<project_id>" # Укажите идентификатор проекта
    description = "Second VPC"
    }
    # Создание подсети 10.1.1.0/24 в vpc-1
    resource "cloudru_evolution_compute_subnet" "resource_subnet1" {
    project_id = "<project_id>" # Укажите идентификатор проекта
    vpc_id = cloudru_evolution_vpc_vpc.resource_vpc1.id
    name = "subnet-1"
    subnet_address = "10.1.1.0/24"
    routed_network = true
    default = false
    zone_identifier = {
    name = "ru.AZ-1"
    }
    }
    # Создание подсети 10.2.2.0/24 в vpc-1
    resource "cloudru_evolution_compute_subnet" "resource_subnet2" {
    project_id = "<project_id>" # Укажите идентификатор проекта
    vpc_id = cloudru_evolution_vpc_vpc.resource_vpc1.id
    name = "subnet-2"
    subnet_address = "10.2.2.0/24"
    routed_network = true
    default = true # Если в зоне доступности ru.AZ-2 уже есть основная подсеть, укажите false
    zone_identifier = {
    name = "ru.AZ-2"
    }
    }
    # Создание подсети 10.3.3.0/24 в vpc-2
    resource "cloudru_evolution_compute_subnet" "resource_subnet3" {
    project_id = "<project_id>" # Укажите идентификатор проекта
    vpc_id = cloudru_evolution_vpc_vpc.resource_vpc2.id
    name = "subnet-3"
    subnet_address = "10.3.3.0/24"
    routed_network = true
    default = false
    zone_identifier = {
    name = "ru.AZ-1"
    }
    }
    # Создание Magic Router
    resource "cloudru_evolution_magic_router_magic_router" "resource_magic_router" {
    project_id = "<project_id>" # Укажите идентификатор проекта
    name = "magic-router"
    }
    # Создание соединения с vpc-1
    resource "cloudru_evolution_magic_router_vpc_connection" "resource_vpc_connection1" {
    name = "first_vpc_connection"
    magic_router_id = cloudru_evolution_magic_router_magic_router.resource_magic_router.id
    vpc_id = cloudru_evolution_vpc_vpc.resource_vpc1.id
    }
    # Создание соединения с vpc-2
    resource "cloudru_evolution_magic_router_vpc_connection" "resource_vpc_connection2" {
    name = "second_vpc_connection"
    magic_router_id = cloudru_evolution_magic_router_magic_router.resource_magic_router.id
    vpc_id = cloudru_evolution_vpc_vpc.resource_vpc2.id
    }
    # Создание статических маршрутов на Magic Router
    resource "cloudru_evolution_magic_router_static_route" "resource_static_route1" {
    depends_on = [cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection1]
    magic_router_id = cloudru_evolution_magic_router_magic_router.resource_magic_router.id
    subnet = "10.1.1.0/24"
    next_hop_vpc = {
    az_name = "ru.AZ-1"
    vpc_connection_id = cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection1.id
    }
    }
    resource "cloudru_evolution_magic_router_static_route" "resource_static_route2" {
    depends_on = [cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection1]
    magic_router_id = cloudru_evolution_magic_router_magic_router.resource_magic_router.id
    subnet = "10.2.2.0/24"
    next_hop_vpc = {
    az_name = "ru.AZ-2"
    vpc_connection_id = cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection1.id
    }
    }
    resource "cloudru_evolution_magic_router_static_route" "resource_static_route3" {
    depends_on = [cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection2]
    magic_router_id = cloudru_evolution_magic_router_magic_router.resource_magic_router.id
    subnet = "10.3.3.0/24"
    next_hop_vpc = {
    az_name = "ru.AZ-1"
    vpc_connection_id = cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection2.id
    }
    }
    # Создание пользовательских маршрутов в vpc-1
    resource "cloudru_evolution_vpc_static_route" "resource_static_route1" {
    depends_on = [cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection1]
    vpc_id = cloudru_evolution_vpc_vpc.resource_vpc1.id
    project_id = "<project_id>" # Укажите идентификатор проекта
    next_hop = {
    magic_router = {
    magic_router_identifier = {
    id = cloudru_evolution_magic_router_magic_router.resource_magic_router.id
    }
    az_name = "ru.AZ-1"
    }
    }
    subnet = "10.3.3.0/24"
    }
    resource "cloudru_evolution_vpc_static_route" "resource_static_route2" {
    depends_on = [cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection1]
    vpc_id = cloudru_evolution_vpc_vpc.resource_vpc1.id
    project_id = "<project_id>" # Укажите идентификатор проекта
    next_hop = {
    magic_router = {
    magic_router_identifier = {
    id = cloudru_evolution_magic_router_magic_router.resource_magic_router.id
    }
    az_name = "ru.AZ-2"
    }
    }
    subnet = "10.3.3.0/24"
    }
    # Создание пользовательских маршрутов в vpc-2
    resource "cloudru_evolution_vpc_static_route" "resource_static_route3" {
    depends_on = [cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection2]
    vpc_id = cloudru_evolution_vpc_vpc.resource_vpc2.id
    project_id = "<project_id>" # Укажите идентификатор проекта
    next_hop = {
    magic_router = {
    magic_router_identifier = {
    id = cloudru_evolution_magic_router_magic_router.resource_magic_router.id
    }
    az_name = "ru.AZ-1"
    }
    }
    subnet = "10.1.1.0/24"
    }
    resource "cloudru_evolution_vpc_static_route" "resource_static_route4" {
    depends_on = [cloudru_evolution_magic_router_vpc_connection.resource_vpc_connection2]
    vpc_id = cloudru_evolution_vpc_vpc.resource_vpc2.id
    project_id = "<project_id>" # Укажите идентификатор проекта
    next_hop = {
    magic_router = {
    magic_router_identifier = {
    id = cloudru_evolution_magic_router_magic_router.resource_magic_router.id
    }
    az_name = "ru.AZ-1"
    }
    }
    subnet = "10.2.2.0/24"
    }
    # Настройка правил входящего трафика для группы безопасности SSH-access_ru.AZ-1
    resource "cloudru_evolution_compute_security_group_rule" "resource_security_group_rule1" {
    direction = "TRAFFIC_DIRECTION_INGRESS"
    ether_type = "ETHER_TYPE_IPV4"
    ip_protocol = "IP_PROTOCOL_ANY"
    port_range = "any"
    remote_ip_prefix = "10.2.2.0/24"
    security_group_id = "<SSH-access_ru.AZ-1_id>" # Укажите идентификатор группы безопасности
    }
    resource "cloudru_evolution_compute_security_group_rule" "resource_security_group_rule2" {
    direction = "TRAFFIC_DIRECTION_INGRESS"
    ether_type = "ETHER_TYPE_IPV4"
    ip_protocol = "IP_PROTOCOL_ANY"
    port_range = "any"
    remote_ip_prefix = "10.3.3.0/24"
    security_group_id = "<SSH-access_ru.AZ-1_id>" # Укажите идентификатор группы безопасности
    }
    # Настройка правил входящего трафика для группы безопасности SSH-access_ru.AZ-2
    resource "cloudru_evolution_compute_security_group_rule" "resource_security_group_rule3" {
    direction = "TRAFFIC_DIRECTION_INGRESS"
    ether_type = "ETHER_TYPE_IPV4"
    ip_protocol = "IP_PROTOCOL_ANY"
    port_range = "any"
    remote_ip_prefix = "10.1.1.0/24"
    security_group_id = "<SSH-access_ru.AZ-2_id>" # Укажите идентификатор группы безопасности
    }
    resource "cloudru_evolution_compute_security_group_rule" "resource_security_group_rule4" {
    direction = "TRAFFIC_DIRECTION_INGRESS"
    ether_type = "ETHER_TYPE_IPV4"
    ip_protocol = "IP_PROTOCOL_ANY"
    port_range = "any"
    remote_ip_prefix = "10.3.3.0/24"
    security_group_id = "<SSH-access_ru.AZ-2_id>" # Укажите идентификатор группы безопасности
    }

    Где:

    • <project_id> — идентификатор проекта.

    • <SSH-access_ru.AZ-1_id>, <SSH-access_ru.AZ-2_id> — идентификаторы групп безопасности SSH-access_ru.AZ-1, SSH-access_ru.AZ-2.

  3. Проверьте правильность конфигурационного файла:

    terraform validate

    Если в конфигурации нет ошибок, появится сообщение:

    Success! The configuration is valid.
  4. Просмотрите планируемые изменения.

    terraform plan

    При успешном выполнении отобразится список ресурсов и их параметры.

  5. Запустите создание ресурсов:

    terraform apply
  6. Подтвердите создание ресурсов: введите yes и нажмите Enter.

    Если нет ошибок, появится сообщение:

    Apply complete! Resources: 19 added, 0 changed, 0 destroyed.

3. Проверьте сетевую связность

  1. В подсетях subnet-1, subnet-2 и subnet-3 разместите по одной виртуальной машине, создав их с помощью Terraform или в личном кабинете вручную.

  2. Подключитесь к первой виртуальной машине через виртуальную консоль.

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

    ping <IP>

    Где IP — IP-адрес виртуальной машины, связность с которой надо проверить.

  4. Повторите шаги 2, 3 для второй и третьей виртуальной машины.

Результат

Вы настроили сетевую связность между подсетями в разных VPC, принадлежащих одному проекту, с помощью Terraform.