С помощью этого руководства вы развернете кластер Managed PostgreSQL с дисковым хранилищем, создадите базу данных, пользователя и резервную копию с помощью Terraform.
Все ресурсы будут находиться в приватной подсети.
Terraform будет единой точкой управления инфраструктурой: вы опишете желаемое состояние кластера в конфигурационных файлах, а Terraform Provider создаст ресурсы через API Cloud.ru.
Чтобы не указывать в конфигурации значения, которые могут измениться на стороне облачной платформы, Terraform получит актуальную версию PostgreSQL и доступную конфигурацию кластера из источников данных:
Для развертывания вы будете использовать следующие сервисы:
Managed PostgreSQL — управляемая база данных PostgreSQL.
VPC — изолированная виртуальная сеть для создания безопасной инфраструктуры.
Шаги:
Зарегистрируйтесь в личном кабинете Cloud.ru.
Если вы уже зарегистрированы, войдите под своей учетной записью.
Создайте сервисный аккаунт и ключ доступа. Сохраните Key ID (логин) и Key Secret (пароль): они потребуются для аутентификации в Terraform.
Создайте подсеть для размещения кластера и скопируйте ее идентификатор.
Подготовьте пароль пользователя PostgreSQL.
Примеры конфигурации подготовлены для Terraform Provider версии 2.1.6.
Создайте файл terraform.tfvars и укажите данные для подключения Terraform Provider к проекту и параметры кластера:
auth_key_id = "<auth_key_id>"auth_secret = "<auth_secret>"project_id = "<project_id>"subnet_id = "<subnet_id>"postgresql_user_password = "<postgresql_user_password>"
Где:
<auth_key_id> — Key ID (логин) ключа доступа сервисного аккаунта.
<auth_secret> — Key Secret (пароль) ключа доступа сервисного аккаунта.
<project_id> — идентификатор проекта.
<subnet_id> — идентификатор подсети для размещения кластера.
<postgresql_user_password> — пароль пользователя PostgreSQL.
Не добавляйте terraform.tfvars с ключами доступа и паролем в систему контроля версий.
Создайте файл variables.tf с описанием входных переменных:
variable "auth_key_id" {type = stringsensitive = true}variable "auth_secret" {type = stringsensitive = true}variable "project_id" {description = "ID проекта в Evolution Cloud"type = string}variable "subnet_id" {description = "ID подсети для размещения кластера PostgreSQL"type = string}variable "postgresql_user_password" {type = stringsensitive = true}
Создайте файл 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"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"}}
Создайте файл data.tf с источниками данных для выбора актуальной версии PostgreSQL и доступной конфигурации кластера:
data "cloudru_evolution_postgresql_version_collection" "test_postgresql" {product_type = "postgres"}data "cloudru_evolution_postgresql_specification_collection" "test_postgresql" {product_type = "postgres"version_name = reverse(sort([for version in data.cloudru_evolution_postgresql_version_collection.test_postgresql.versions :version.name]))[0]}
Создайте файл postgresql.tf с конфигурацией кластера Managed PostgreSQL:
resource "cloudru_evolution_postgresql_cluster" "test_postgresql" {name = "test-postgresql-1"project_id = var.project_idversion = reverse(sort([for version in data.cloudru_evolution_postgresql_version_collection.test_postgresql.versions :version.name]))[0]specification_id = data.cloudru_evolution_postgresql_specification_collection.test_postgresql.specifications[0].idsubnet_id = var.subnet_idsubnet_ids = [var.subnet_id]instances = 1storage = {pg_data_gb = 20}initial_database = "test"backup = {schedule = "0 3 * * 0"retention_policy_days = 7}timeouts {create = "60m"update = "30m"delete = "20m"}lifecycle {ignore_changes = [timeouts]}}
В файл postgresql.tf добавьте конфигурацию пользователя PostgreSQL:
resource "cloudru_evolution_postgresql_user" "test_postgresql_user" {name = "test"password = var.postgresql_user_passwordcluster_id = cloudru_evolution_postgresql_cluster.test_postgresql.idtimeouts {create = "60m"update = "30m"delete = "20m"}lifecycle {ignore_changes = [timeouts]}}
В файл postgresql.tf добавьте конфигурацию базы данных:
resource "cloudru_evolution_postgresql_database" "test_postgresql_database" {name = "test_app"owner = cloudru_evolution_postgresql_user.test_postgresql_user.namecluster_id = cloudru_evolution_postgresql_cluster.test_postgresql.idlc_collate = "C"lc_ctype = "C"timeouts {create = "60m"update = "30m"delete = "20m"}lifecycle {ignore_changes = [timeouts]}}
В файл postgresql.tf добавьте конфигурацию резервной копии:
resource "cloudru_evolution_postgresql_backup" "test_postgresql_backup" {name = "test-postgresql-backup"cluster_id = cloudru_evolution_postgresql_cluster.test_postgresql.idtimeouts {create = "60m"update = "30m"delete = "20m"}lifecycle {ignore_changes = [timeouts]}}
Ссылки на атрибуты других ресурсов сформируют граф зависимостей. Terraform сначала создаст кластер, затем пользователя, базу данных и резервную копию.
В терминале перейдите в каталог проекта.
Отформатируйте конфигурационные файлы:
terraform fmt
Инициализируйте рабочий каталог Terraform:
terraform init
Проверьте синтаксис и внутреннюю согласованность конфигурации:
terraform validate
При успешной проверке Terraform выведет сообщение Success! The configuration is valid.
Сформируйте план изменений:
terraform plan
Убедитесь, что Terraform планирует создать кластер Managed PostgreSQL, пользователя, базу данных и резервную копию.
Примените конфигурацию:
terraform apply
Проверьте план еще раз, введите yes и нажмите Enter. Дождитесь сообщения об успешном завершении операции.
Выведите ресурсы, которыми управляет Terraform:
terraform state list
Должны отобразиться следующие ресурсы:
cloudru_evolution_postgresql_cluster.test_postgresql;
cloudru_evolution_postgresql_user.test_postgresql_user;
cloudru_evolution_postgresql_database.test_postgresql_database;
cloudru_evolution_postgresql_backup.test_postgresql_backup.
Перейдите в личный кабинет и проверьте, что кластер Managed PostgreSQL создан в выбранном проекте и перешел в рабочее состояние.
Проверьте, что в кластере созданы база данных test_app и пользователь test.
Убедитесь, что для кластера настроено дисковое хранилище объемом 20 ГБ и резервное копирование.
После применения конфигурации появится управляемый кластер PostgreSQL с дисковым хранилищем:
Приложение подключится к PostgreSQL по сетевому адресу сервиса:
Terraform отвечает за создание инфраструктуры, а приложение использует созданную базу данных.
Созданный кластер можно использовать как основу для одного приложения, микросервисной архитектуры или общего корпоративного сервиса.
Если инфраструктура больше не нужна, удалите созданные ресурсы, чтобы прекратить потребление платных ресурсов:
terraform destroy
Проверьте план удаления, введите yes и нажмите Enter. Terraform удалит ресурсы с учетом зависимостей между ними.
Вы подготовили Terraform-конфигурацию, развернули кластер Managed PostgreSQL с дисковым хранилищем, создали пользователя, базу данных и резервную копию, а затем проверили созданные ресурсы. Конфигурацию можно использовать как основу для приложений и воспроизводить в разных окружениях, изменяя входные переменные Terraform.