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

Развертывание Managed PostgreSQL с помощью Terraform

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

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

Все ресурсы будут находиться в приватной подсети.

../_images/tf_postgresql.svg

Terraform будет единой точкой управления инфраструктурой: вы опишете желаемое состояние кластера в конфигурационных файлах, а Terraform Provider создаст ресурсы через API Cloud.ru.

Чтобы не указывать в конфигурации значения, которые могут измениться на стороне облачной платформы, Terraform получит актуальную версию PostgreSQL и доступную конфигурацию кластера из источников данных:

../_images/tf_datasources_postgres.svg

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

  • Managed PostgreSQL — управляемая база данных PostgreSQL.

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

Шаги:

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

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

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

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

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

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

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

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

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

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

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

  6. Создайте VPC.

  7. Создайте подсеть для размещения кластера и скопируйте ее идентификатор.

  8. Подготовьте пароль пользователя PostgreSQL.

Примечание

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

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

  1. Создайте файл 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 с ключами доступа и паролем в систему контроля версий.

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

    variable "auth_key_id" {
    type = string
    sensitive = true
    }
    variable "auth_secret" {
    type = string
    sensitive = true
    }
    variable "project_id" {
    description = "ID проекта в Evolution Cloud"
    type = string
    }
    variable "subnet_id" {
    description = "ID подсети для размещения кластера PostgreSQL"
    type = string
    }
    variable "postgresql_user_password" {
    type = string
    sensitive = true
    }
  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"
    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"
    }
    }
  4. Создайте файл 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]
    }
  5. Создайте файл postgresql.tf с конфигурацией кластера Managed PostgreSQL:

    resource "cloudru_evolution_postgresql_cluster" "test_postgresql" {
    name = "test-postgresql-1"
    project_id = var.project_id
    version = 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].id
    subnet_id = var.subnet_id
    subnet_ids = [var.subnet_id]
    instances = 1
    storage = {
    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]
    }
    }
  6. В файл postgresql.tf добавьте конфигурацию пользователя PostgreSQL:

    resource "cloudru_evolution_postgresql_user" "test_postgresql_user" {
    name = "test"
    password = var.postgresql_user_password
    cluster_id = cloudru_evolution_postgresql_cluster.test_postgresql.id
    timeouts {
    create = "60m"
    update = "30m"
    delete = "20m"
    }
    lifecycle {
    ignore_changes = [timeouts]
    }
    }
  7. В файл postgresql.tf добавьте конфигурацию базы данных:

    resource "cloudru_evolution_postgresql_database" "test_postgresql_database" {
    name = "test_app"
    owner = cloudru_evolution_postgresql_user.test_postgresql_user.name
    cluster_id = cloudru_evolution_postgresql_cluster.test_postgresql.id
    lc_collate = "C"
    lc_ctype = "C"
    timeouts {
    create = "60m"
    update = "30m"
    delete = "20m"
    }
    lifecycle {
    ignore_changes = [timeouts]
    }
    }
  8. В файл postgresql.tf добавьте конфигурацию резервной копии:

    resource "cloudru_evolution_postgresql_backup" "test_postgresql_backup" {
    name = "test-postgresql-backup"
    cluster_id = cloudru_evolution_postgresql_cluster.test_postgresql.id
    timeouts {
    create = "60m"
    update = "30m"
    delete = "20m"
    }
    lifecycle {
    ignore_changes = [timeouts]
    }
    }

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

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

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

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

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

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

    terraform validate

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

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

    terraform plan

    Убедитесь, что Terraform планирует создать кластер Managed PostgreSQL, пользователя, базу данных и резервную копию.

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

    terraform apply
  7. Проверьте план еще раз, введите yes и нажмите Enter. Дождитесь сообщения об успешном завершении операции.

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

  1. Выведите ресурсы, которыми управляет 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.

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

  3. Проверьте, что в кластере созданы база данных test_app и пользователь test.

  4. Убедитесь, что для кластера настроено дисковое хранилище объемом 20 ГБ и резервное копирование.

Как работает созданный кластер

После применения конфигурации появится управляемый кластер PostgreSQL с дисковым хранилищем:

../_images/tf_postgresql_cluster.svg

Приложение подключится к PostgreSQL по сетевому адресу сервиса:

../_images/tf_app_to_database.svg

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

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

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

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

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

terraform destroy

Проверьте план удаления, введите yes и нажмите Enter. Terraform удалит ресурсы с учетом зависимостей между ними.

Результат

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