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

Настройка связности между VPC через Magic Router с помощью Terraform

Эта статья полезна?

С помощью этого руководства вы создадите две изолированные VPC с подсетями и настроите обмен трафиком между ними через Magic Router с помощью Terraform.

До настройки маршрутизации сети изолированы:

../_images/subnets_with_mr.svg

Magic Router будет центральной точкой маршрутизации между VPC:

../_images/magic_router1.svg

Terraform создаст сетевые ресурсы, подключит обе VPC к Magic Router и настроит статические маршруты:

../_images/magic_router2.svg

В результате между подсетями появится двунаправленная маршрутизация:

../_images/magic_router3.svg

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

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

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

  • «Подсети» — сервис, позволяющий создавать подсети для размещения в них облачных ресурсов.

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

Примечание

Примеры конфигурации подготовлены для Terraform Provider версии 2.1.6.

Шаги:

  1. Подготовьте файлы конфигурации.

  2. Разверните инфраструктуру.

  3. Проверьте созданные ресурсы.

  4. Удалите созданные ресурсы.

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

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

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

  2. Установите Terraform.

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

  4. Создайте сервисный аккаунт.

  5. Создайте ключ доступа.

    Сохраните Key ID (логин) и Key Secret (пароль): они потребуются для аутентификации в Terraform.

  6. Скопируйте идентификатор проекта.

  7. Выберите зону доступности, в которой будут созданы подсети.

1. Подготовьте файлы конфигурации

  1. Создайте файл terraform.tfvars и укажите данные для подключения Terraform Provider к проекту и параметры сетевой инфраструктуры:

    auth_key_id = "<auth_key_id>"
    auth_secret = "<auth_secret>"
    project_id = "<project_id>"
    target_zone = "ru.AZ-1"

    Где:

    • <auth_key_id> — Key ID ключа доступа сервисного аккаунта.

    • <auth_secret> — Key Secret ключа доступа сервисного аккаунта.

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

    • target_zone — зона доступности, в которой будут созданы подсети.

    Внимание

    Не добавляйте terraform.tfvars с ключами доступа в систему контроля версий.

  2. Создайте файл variables.tf с описанием входных переменных:

    variable "auth_key_id" {
    type = string
    sensitive = true
    }
    variable "auth_secret" {
    type = string
    sensitive = true
    }
    variable "project_id" {
    description = "ID проекта в Evolution"
    type = string
    }
    variable "target_zone" {
    description = "Зона доступности для подсетей и статических маршрутов"
    type = string
    default = "ru.AZ-1"
    }
    variable "vpc_a_subnet" {
    description = "Адрес подсети в VPC A"
    type = string
    default = "10.10.0.0/24"
    }
    variable "vpc_b_subnet" {
    description = "Адрес подсети в VPC B"
    type = string
    default = "10.20.0.0/24"
    }
  3. Создайте файл main.tf с конфигурацией Terraform Provider и адресами API сервисов:

    terraform {
    required_providers {
    cloudru = {
    source = "cloud.ru/cloudru/cloud"
    version = "2.1.6"
    }
    }
    }
    provider "cloudru" {
    auth_key_id = var.auth_key_id
    auth_secret = var.auth_secret
    region = "ru-central-1"
    project_id = var.project_id
    endpoints = {
    iam_endpoint = "iam.api.cloud.ru:443"
    compute_endpoint = "compute.api.cloud.ru:443"
    baremetal_endpoint = "baremetal.api.cloud.ru:443"
    mk8s_endpoint = "mk8s.api.cloud.ru:443"
    vpc_endpoint = "vpc.api.cloud.ru:443"
    magic_router_endpoint = "magic-router.api.cloud.ru:443"
    dns_endpoint = "dns.api.cloud.ru:443"
    nlb_endpoint = "nlb.api.cloud.ru:443"
    kafka_endpoint = "kafka.api.cloud.ru:443"
    redis_endpoint = "redis.api.cloud.ru:443"
    spark_endpoint = "dataplatform.api.cloud.ru:443"
    trino_endpoint = "dataplatform.api.cloud.ru:443"
    metastore_endpoint = "dataplatform.api.cloud.ru:443"
    artifact_registry_endpoint = "ar.api.cloud.ru:443"
    object_storage_endpoint = "https://s3.cloud.ru"
    cloud_platform_endpoint = "organization.api.cloud.ru:443"
    postgresql_endpoint = "postgresql.api.cloud.ru:443"
    }
    }
  4. Создайте файл network.tf с конфигурацией двух VPC и подсетей:

    resource "cloudru_evolution_vpc_vpc" "vpc_a" {
    name = "test-vpc-a"
    project_id = var.project_id
    description = "VPC A for Magic Router tutorial"
    }
    resource "cloudru_evolution_vpc_vpc" "vpc_b" {
    name = "test-vpc-b"
    project_id = var.project_id
    description = "VPC B for Magic Router tutorial"
    }
    resource "cloudru_evolution_compute_subnet" "vpc_a" {
    project_id = var.project_id
    name = "test-subnet-a"
    zone = {
    name = var.target_zone
    }
    vpc_id = cloudru_evolution_vpc_vpc.vpc_a.id
    subnet_address = var.vpc_a_subnet
    routed_network = true
    }
    resource "cloudru_evolution_compute_subnet" "vpc_b" {
    project_id = var.project_id
    name = "test-subnet-b"
    zone = {
    name = var.target_zone
    }
    vpc_id = cloudru_evolution_vpc_vpc.vpc_b.id
    subnet_address = var.vpc_b_subnet
    routed_network = true
    }

    Диапазоны подсетей не должны пересекаться. Иначе Magic Router не сможет однозначно определить, в какую сеть направить трафик.

  5. Создайте файл magic-router.tf с конфигурацией Magic Router и подключений к VPC:

    resource "cloudru_evolution_magic_router_magic_router" "test" {
    project_id = var.project_id
    name = "test-magic-router"
    description = "Magic Router for two isolated VPCs"
    }
    resource "cloudru_evolution_magic_router_vpc_connection" "vpc_a" {
    magic_router_id = cloudru_evolution_magic_router_magic_router.test.id
    vpc_id = cloudru_evolution_vpc_vpc.vpc_a.id
    name = "vpc-a-connection"
    }
    resource "cloudru_evolution_magic_router_vpc_connection" "vpc_b" {
    magic_router_id = cloudru_evolution_magic_router_magic_router.test.id
    vpc_id = cloudru_evolution_vpc_vpc.vpc_b.id
    name = "vpc-b-connection"
    }
  6. В файл magic-router.tf добавьте статические маршруты на Magic Router:

    resource "cloudru_evolution_magic_router_static_route" "to_vpc_a" {
    magic_router_id = cloudru_evolution_magic_router_magic_router.test.id
    subnet = var.vpc_a_subnet
    description = "Route to VPC A"
    next_hop_vpc = {
    az_name = var.target_zone
    vpc_connection_id = cloudru_evolution_magic_router_vpc_connection.vpc_a.id
    }
    }
    resource "cloudru_evolution_magic_router_static_route" "to_vpc_b" {
    magic_router_id = cloudru_evolution_magic_router_magic_router.test.id
    subnet = var.vpc_b_subnet
    description = "Route to VPC B"
    next_hop_vpc = {
    az_name = var.target_zone
    vpc_connection_id = cloudru_evolution_magic_router_vpc_connection.vpc_b.id
    }
    }

    Маршрут to_vpc_a направляет трафик к подсети VPC A, а маршрут to_vpc_b — к подсети VPC B.

  7. В файл magic-router.tf добавьте статические маршруты в VPC:

    resource "cloudru_evolution_vpc_static_route" "vpc_a_to_vpc_b" {
    depends_on = [
    cloudru_evolution_magic_router_vpc_connection.vpc_a,
    cloudru_evolution_magic_router_vpc_connection.vpc_b,
    ]
    project_id = var.project_id
    vpc_id = cloudru_evolution_vpc_vpc.vpc_a.id
    subnet = var.vpc_b_subnet
    description = "Route from VPC A to VPC B"
    next_hop = {
    magic_router = {
    magic_router_identifier = {
    id = cloudru_evolution_magic_router_magic_router.test.id
    }
    az_name = var.target_zone
    }
    }
    }
    resource "cloudru_evolution_vpc_static_route" "vpc_b_to_vpc_a" {
    depends_on = [
    cloudru_evolution_magic_router_vpc_connection.vpc_a,
    cloudru_evolution_magic_router_vpc_connection.vpc_b,
    ]
    project_id = var.project_id
    vpc_id = cloudru_evolution_vpc_vpc.vpc_b.id
    subnet = var.vpc_a_subnet
    description = "Route from VPC B to VPC A"
    next_hop = {
    magic_router = {
    magic_router_identifier = {
    id = cloudru_evolution_magic_router_magic_router.test.id
    }
    az_name = var.target_zone
    }
    }
    }

    Эти маршруты направляют трафик к удаленной подсети через Magic Router.

  8. Создайте файл data.tf с источниками данных для получения созданных подключений и маршрутов:

    data "cloudru_evolution_magic_router_vpc_connection_collection" "test" {
    depends_on = [
    cloudru_evolution_magic_router_vpc_connection.vpc_a,
    cloudru_evolution_magic_router_vpc_connection.vpc_b,
    ]
    project_id = var.project_id
    magic_router_id = cloudru_evolution_magic_router_magic_router.test.id
    }
    data "cloudru_evolution_magic_router_static_route_collection" "test" {
    depends_on = [
    cloudru_evolution_magic_router_static_route.to_vpc_a,
    cloudru_evolution_magic_router_static_route.to_vpc_b,
    ]
    project_id = var.project_id
    magic_router_id = cloudru_evolution_magic_router_magic_router.test.id
    }
    output "vpc_connections" {
    value = data.cloudru_evolution_magic_router_vpc_connection_collection.test.vpc_connections
    }
    output "magic_router_routes" {
    value = data.cloudru_evolution_magic_router_static_route_collection.test.routes
    }

    Ссылки на атрибуты других ресурсов сформируют граф зависимостей. Terraform создаст VPC и подсети, затем Magic Router, подключения и статические маршруты.

2. Разверните инфраструктуру

  1. В терминале перейдите в каталог проекта.

  2. Отформатируйте конфигурационные файлы:

    terraform fmt
  3. Инициализируйте рабочий каталог Terraform:

    terraform init
  4. Проверьте синтаксис и внутреннюю согласованность конфигурации:

    terraform validate

    При успешной проверке Terraform выведет сообщение Success! The configuration is valid.

  5. Сформируйте план изменений:

    terraform plan

    Убедитесь, что Terraform планирует создать две VPC, две подсети, Magic Router, два подключения к VPC и четыре статических маршрута.

  6. Примените конфигурацию:

    terraform apply
  7. Проверьте план еще раз, введите yes и нажмите Enter.

    Дождитесь сообщения об успешном завершении операции.

3. Проверьте созданные ресурсы

  1. Выведите ресурсы, которыми управляет Terraform:

    terraform state list

    В списке должны присутствовать две VPC, две подсети, Magic Router, два подключения к VPC и четыре статических маршрута.

  2. Проверьте выходные данные конфигурации:

    terraform output

    Убедитесь, что Terraform вывел два подключения к VPC и два маршрута на Magic Router.

  3. Перейдите в личный кабинет и проверьте, что ресурсы созданы в выбранном проекте и перешли в рабочее состояние.

  4. Убедитесь, что на Magic Router настроены маршруты к подсетям 10.10.0.0/24 и 10.20.0.0/24, а в каждой VPC — маршрут к удаленной подсети через Magic Router.

Как работает маршрутизация

Например, ресурс с адресом 10.10.0.10 в VPC A отправляет запрос ресурсу 10.20.0.10 в VPC B. Статический маршрут в VPC A направляет трафик к Magic Router, а маршрут на Magic Router — к подключению VPC B:

../_images/magic_router4.svg

Обратный трафик проходит по маршрутам в противоположном направлении:

../_images/magic_router5.svg

Наличие маршрута определяет сетевой путь, но не разрешает трафик автоматически. Чтобы ограничить доступ, настройте группы безопасности, сетевые ACL или правила межсетевого экрана для целевых ресурсов.

Варианты использования инфраструктуры

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

4. Удалите созданные ресурсы

  1. Если инфраструктура больше не нужна, удалите созданные ресурсы, чтобы прекратить потребление платных ресурсов:

    terraform destroy
  2. Проверьте план удаления, введите yes и нажмите Enter.

    Terraform удалит ресурсы с учетом зависимостей между ними.

Результат

Вы подготовили Terraform-конфигурацию, создали две VPC с подсетями, подключили их к Magic Router и настроили двунаправленную статическую маршрутизацию. Итоговая схема сетевой связности выглядит следующим образом:

../_images/mr_final_schema.svg

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