С помощью этого руководства вы развернете приватную инфраструктуру для распределенного приложения с использованием Terraform: виртуальную сеть, подсеть, кластеры Managed Kafka и Managed Redis, а также внутренний DNS-сервер.
Созданные ресурсы будут находиться в одной VPC и взаимодействовать через приватную сеть:
Terraform будет единой точкой управления инфраструктурой: вы опишете ее желаемое состояние в конфигурационных файлах, а Terraform Provider создаст ресурсы через API Cloud.ru.
Ссылки между ресурсами в конфигурации сформируют граф зависимостей. Например, кластеры Kafka и Redis будут ссылаться на созданную подсеть, а DNS-сервер — на подсеть и VPC. Terraform определит порядок создания ресурсов автоматически.
Kafka и Redis будут созданы как управляемые сервисы: устанавливать их на виртуальные машины и обслуживать инфраструктурное программное обеспечение самостоятельно не потребуется.
Для развертывания вы будете использовать следующие сервисы:
Managed Kafka — сервис для развертывания и управления кластерами Apache Kafka®.
Managed Redis — хранилище данных в оперативной памяти.
DNS — сервис по управлению приватными и публичными зонами и их ресурсными записями.
VPC — изолированная виртуальная сеть для создания безопасной инфраструктуры.
«Подсети» — сервис, позволяющий создавать подсети для размещения в них облачных ресурсов.
Шаги:
Зарегистрируйтесь в личном кабинете Cloud.ru.
Если вы уже зарегистрированы, войдите под своей учетной записью.
Создайте сервисный аккаунт и ключ доступа. Сохраните Key ID (логин) и Key Secret (пароль): они потребуются для аутентификации в Terraform.
Примеры конфигурации подготовлены для Terraform Provider версии 2.1.4.
Создайте файл terraform.tfvars и укажите данные для подключения Terraform Provider к проекту:
auth_key_id = "<auth_key_id>"auth_secret = "<auth_secret>"project_id = "<project_id>"
Где:
<auth_key_id> — Key ID ключа доступа сервисного аккаунта.
<auth_secret> — Key Secret ключа доступа сервисного аккаунта.
<project_id> — идентификатор проекта Cloud.ru.
Не добавляйте terraform.tfvars с ключами доступа в систему контроля версий.
Создайте файл variables.tf с описанием входных переменных:
variable "auth_key_id" {type = stringsensitive = true}variable "auth_secret" {type = stringsensitive = true}variable "project_id" {description = "ID проекта в EVO Cloud"type = string}variable "kafka_brokers" {type = numberdescription = "Number of Kafka brokers"default = 3}variable "kafka_storage_gib" {type = numberdescription = "Kafka storage size in GiB"default = 50}variable "redis_storage_gib" {type = numberdescription = "Redis storage size in GiB"default = 40}variable "subnet_address" {type = stringdescription = "Private subnet address"default = "10.20.0.0/24"}
Создайте файл main.tf с конфигурацией Terraform Provider и адресами API сервисов:
terraform {required_providers {cloudru = {source = "cloud.ru/cloudru/cloud"version = "2.1.4"}}}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"dns_endpoint = "dns.api.cloud.ru:443"nlb_endpoint = "nlb.api.cloud.ru"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"}}
Создайте файл kafka.tf с конфигурацией кластера Managed Kafka:
resource "cloudru_evolution_kafka_cluster" "test" {name = "test-private-kafka"project_id = var.project_idversion_id = local.kafka_version_idspecification_id = local.kafka_specification_idbrokers = var.kafka_brokersstorage_gib = var.kafka_storage_gibsubnet_id = cloudru_evolution_compute_subnet.test_data.idui_enabled = falsecruise_control_enabled = falsecruise_control_rebalance_auto_enabled = false}
Создайте файл redis.tf с конфигурацией кластера Managed Redis:
resource "cloudru_evolution_redis_cluster" "test" {name = "test-private-redis"project_id = var.project_idversion_id = local.redis_version_idspecification_id = local.redis_specification_idsubnet_id = cloudru_evolution_compute_subnet.test_data.idtype = "CLUSTER"shards = 1replicas = 2storage_gib = var.redis_storage_gib}
Создайте файл dns.tf с конфигурацией внутреннего DNS-сервера:
resource "cloudru_evolution_dns_dns_server" "test" {name = "test-dns"availability_zone_id = local.availability_zone_idsubnet_id = cloudru_evolution_compute_subnet.test_data.idvpc_id = cloudru_evolution_vpc_vpc.test.idip_address = "10.20.0.10"}
Создайте файл network.tf с конфигурацией VPC и подсети для размещения сервисов:
resource "cloudru_evolution_vpc_vpc" "test" {name = "test-data-platform-vpc"project_id = var.project_iddescription = "Private Kafka and Redis network"}resource "cloudru_evolution_compute_subnet" "test_data" {project_id = var.project_idname = "test-data-subnet"zone = {id = local.availability_zone_id}vpc_id = cloudru_evolution_vpc_vpc.test.idsubnet_address = var.subnet_addressrouted_network = true}
Создайте файл data.tf с источниками данных для выбора зоны доступности, версий и конфигураций кластеров:
data "cloudru_evolution_compute_zone_collection" "test_available" {project_id = var.project_id}data "cloudru_evolution_kafka_version_collection" "test_available" {product_type = "kafka"}data "cloudru_evolution_redis_version_collection" "test_available" {}locals {availability_zone = one([for zone in data.cloudru_evolution_compute_zone_collection.test_available.zones :zoneif zone.enabled && zone.default])availability_zone_id = local.availability_zone.idavailability_zone_name = local.availability_zone.namekafka_versions = data.cloudru_evolution_kafka_version_collection.test_available.versionskafka_version = local.kafka_versions[length(local.kafka_versions) - 1]kafka_version_id = local.kafka_version.idredis_versions = data.cloudru_evolution_redis_version_collection.test_available.versionsredis_version = local.redis_versions[length(local.redis_versions) - 1]redis_version_id = local.redis_version.id}data "cloudru_evolution_kafka_specification_collection" "test_available" {availability_zone_id = local.availability_zone_idversion_id = local.kafka_version_id}data "cloudru_evolution_redis_specification_collection" "test_available" {availability_zone_id = local.availability_zone_idversion_id = local.redis_version_id}locals {kafka_specifications = [for specification in data.cloudru_evolution_kafka_specification_collection.test_available.specifications :specificationif(specification.min_brokers <= var.kafka_brokers &&specification.max_brokers >= var.kafka_brokers &&specification.min_storage_gigs <= var.kafka_storage_gib)]kafka_specification = local.kafka_specifications[0]kafka_specification_id = local.kafka_specification.idredis_specifications = data.cloudru_evolution_redis_specification_collection.test_available.specificationsredis_specification = local.redis_specifications[0]redis_specification_id = local.redis_specification.id}
В терминале перейдите в каталог проекта.
Отформатируйте конфигурационные файлы:
terraform fmt
Инициализируйте рабочий каталог Terraform:
terraform init
Проверьте синтаксис и внутреннюю согласованность конфигурации:
terraform validate
При успешной проверке Terraform выведет сообщение Success! The configuration is valid.
Сформируйте план изменений:
terraform plan
Убедитесь, что Terraform планирует создать VPC, подсеть, кластеры Managed Kafka и Managed Redis, а также DNS-сервер.
Примените конфигурацию:
terraform apply
Проверьте план еще раз, введите yes и нажмите Enter. Дождитесь сообщения об успешном завершении операции.
Выведите ресурсы, которыми управляет Terraform:
terraform state list
Должны отобразиться следующие ресурсы:
cloudru_evolution_vpc_vpc.test;
cloudru_evolution_compute_subnet.test_data;
cloudru_evolution_kafka_cluster.test;
cloudru_evolution_redis_cluster.test;
cloudru_evolution_dns_dns_server.test.
Перейдите в личный кабинет Cloud.ru и проверьте, что VPC, подсеть, кластеры Managed Kafka и Managed Redis, а также DNS-сервер созданы в выбранном проекте.
Убедитесь, что кластеры перешли в рабочее состояние и используют созданную подсеть.
Созданные сервисы можно использовать совместно или независимо друг от друга в зависимости от архитектуры приложения.
Если инфраструктура больше не нужна, удалите созданные ресурсы, чтобы прекратить потребление платных ресурсов:
terraform destroy
Проверьте план удаления и введите yes. Terraform удалит ресурсы с учетом зависимостей между ними.
Вы подготовили единую Terraform-конфигурацию для VPC, подсети, кластеров Managed Kafka и Managed Redis и внутреннего DNS-сервера, развернули инфраструктуру и проверили созданные ресурсы. Итоговая схема управления инфраструктурой выглядит следующим образом:
Эту конфигурацию можно использовать как основу приложения и воспроизводить в разных окружениях, изменяя параметры кластеров и сети через входные переменные Terraform.