С помощью этого руководства вы создадите две изолированные VPC с подсетями и настроите обмен трафиком между ними через Magic Router с помощью Terraform.
До настройки маршрутизации сети изолированы:
Magic Router будет центральной точкой маршрутизации между VPC:
Terraform создаст сетевые ресурсы, подключит обе VPC к Magic Router и настроит статические маршруты:
В результате между подсетями появится двунаправленная маршрутизация:
Для развертывания вы будете использовать следующие сервисы:
Terraform — сервис для декларативного управления инфраструктурой с помощью конфигурационных файлов.
VPC — изолированная виртуальная сеть для создания безопасной инфраструктуры.
«Подсети» — сервис, позволяющий создавать подсети для размещения в них облачных ресурсов.
Magic Router — сервис для управления сетевыми связями между ресурсами внутри облачной инфраструктуры.
Примеры конфигурации подготовлены для Terraform Provider версии 2.1.6.
Шаги:
Зарегистрируйтесь в личном кабинете Cloud.ru.
Если вы уже зарегистрированы, войдите под своей учетной записью.
Сохраните Key ID (логин) и Key Secret (пароль): они потребуются для аутентификации в Terraform.
Выберите зону доступности, в которой будут созданы подсети.
Создайте файл 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 с ключами доступа в систему контроля версий.
Создайте файл variables.tf с описанием входных переменных:
variable "auth_key_id" {type = stringsensitive = true}variable "auth_secret" {type = stringsensitive = true}variable "project_id" {description = "ID проекта в Evolution"type = string}variable "target_zone" {description = "Зона доступности для подсетей и статических маршрутов"type = stringdefault = "ru.AZ-1"}variable "vpc_a_subnet" {description = "Адрес подсети в VPC A"type = stringdefault = "10.10.0.0/24"}variable "vpc_b_subnet" {description = "Адрес подсети в VPC B"type = stringdefault = "10.20.0.0/24"}
Создайте файл 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_idauth_secret = var.auth_secretregion = "ru-central-1"project_id = var.project_idendpoints = {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"}}
Создайте файл network.tf с конфигурацией двух VPC и подсетей:
resource "cloudru_evolution_vpc_vpc" "vpc_a" {name = "test-vpc-a"project_id = var.project_iddescription = "VPC A for Magic Router tutorial"}resource "cloudru_evolution_vpc_vpc" "vpc_b" {name = "test-vpc-b"project_id = var.project_iddescription = "VPC B for Magic Router tutorial"}resource "cloudru_evolution_compute_subnet" "vpc_a" {project_id = var.project_idname = "test-subnet-a"zone = {name = var.target_zone}vpc_id = cloudru_evolution_vpc_vpc.vpc_a.idsubnet_address = var.vpc_a_subnetrouted_network = true}resource "cloudru_evolution_compute_subnet" "vpc_b" {project_id = var.project_idname = "test-subnet-b"zone = {name = var.target_zone}vpc_id = cloudru_evolution_vpc_vpc.vpc_b.idsubnet_address = var.vpc_b_subnetrouted_network = true}
Диапазоны подсетей не должны пересекаться. Иначе Magic Router не сможет однозначно определить, в какую сеть направить трафик.
Создайте файл magic-router.tf с конфигурацией Magic Router и подключений к VPC:
resource "cloudru_evolution_magic_router_magic_router" "test" {project_id = var.project_idname = "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.idvpc_id = cloudru_evolution_vpc_vpc.vpc_a.idname = "vpc-a-connection"}resource "cloudru_evolution_magic_router_vpc_connection" "vpc_b" {magic_router_id = cloudru_evolution_magic_router_magic_router.test.idvpc_id = cloudru_evolution_vpc_vpc.vpc_b.idname = "vpc-b-connection"}
В файл 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.idsubnet = var.vpc_a_subnetdescription = "Route to VPC A"next_hop_vpc = {az_name = var.target_zonevpc_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.idsubnet = var.vpc_b_subnetdescription = "Route to VPC B"next_hop_vpc = {az_name = var.target_zonevpc_connection_id = cloudru_evolution_magic_router_vpc_connection.vpc_b.id}}
Маршрут to_vpc_a направляет трафик к подсети VPC A, а маршрут to_vpc_b — к подсети VPC B.
В файл 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_idvpc_id = cloudru_evolution_vpc_vpc.vpc_a.idsubnet = var.vpc_b_subnetdescription = "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_idvpc_id = cloudru_evolution_vpc_vpc.vpc_b.idsubnet = var.vpc_a_subnetdescription = "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.
Создайте файл 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_idmagic_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_idmagic_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, подключения и статические маршруты.
В терминале перейдите в каталог проекта.
Отформатируйте конфигурационные файлы:
terraform fmt
Инициализируйте рабочий каталог Terraform:
terraform init
Проверьте синтаксис и внутреннюю согласованность конфигурации:
terraform validate
При успешной проверке Terraform выведет сообщение Success! The configuration is valid.
Сформируйте план изменений:
terraform plan
Убедитесь, что Terraform планирует создать две VPC, две подсети, Magic Router, два подключения к VPC и четыре статических маршрута.
Примените конфигурацию:
terraform apply
Проверьте план еще раз, введите yes и нажмите Enter.
Дождитесь сообщения об успешном завершении операции.
Выведите ресурсы, которыми управляет Terraform:
terraform state list
В списке должны присутствовать две VPC, две подсети, Magic Router, два подключения к VPC и четыре статических маршрута.
Проверьте выходные данные конфигурации:
terraform output
Убедитесь, что Terraform вывел два подключения к VPC и два маршрута на Magic Router.
Перейдите в личный кабинет и проверьте, что ресурсы созданы в выбранном проекте и перешли в рабочее состояние.
Убедитесь, что на 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:
Обратный трафик проходит по маршрутам в противоположном направлении:
Наличие маршрута определяет сетевой путь, но не разрешает трафик автоматически. Чтобы ограничить доступ, настройте группы безопасности, сетевые ACL или правила межсетевого экрана для целевых ресурсов.
Созданную конфигурацию можно использовать как основу для разделения окружений, приложений и общих сервисов по разным VPC.
Если инфраструктура больше не нужна, удалите созданные ресурсы, чтобы прекратить потребление платных ресурсов:
terraform destroy
Проверьте план удаления, введите yes и нажмите Enter.
Terraform удалит ресурсы с учетом зависимостей между ними.
Вы подготовили Terraform-конфигурацию, создали две VPC с подсетями, подключили их к Magic Router и настроили двунаправленную статическую маршрутизацию. Итоговая схема сетевой связности выглядит следующим образом:
Конфигурацию можно использовать как основу для разделения приложений и окружений по изолированным VPC и воспроизводить в разных проектах, изменяя входные переменные Terraform.