Перейти к основному содержимому
Создать кластер PostgreSQL TimescaleDB
Последнее изменение:

Создать кластер PostgreSQL TimescaleDB

Мы рекомендуем создавать ресурсы по порядку. Если вы единовременно создаете все ресурсы, которые описаны в конфигурационном файле, может возникнуть ошибка — Terraform создает ресурсы независимо от порядка, в котором они перечислены в файле.


  1. Опционально: настройте провайдеры.
  2. Создайте приватную сеть и подсеть.
  3. Создайте кластер.
  4. Создайте пользователя.
  5. Создайте базу данных и назначьте владельца.

Конфигурационные файлы

Пример файла для настройки провайдеров
terraform {
required_providers {
selectel = {
source = "selectel/selectel"
version = "6.0.0"
}
openstack = {
source = "terraform-provider-openstack/openstack"
version = "2.1.0"
}
}
}

provider "selectel" {
domain_name = "123456"
username = "user"
password = "password"
}

resource "selectel_vpc_project_v2" "project_1" {
name = "project"
}

resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
name = "username"
password = "password"
role {
role_name = "member"
scope = "project"
project_id = selectel_vpc_project_v2.project_1.id
}
}

provider "openstack" {
auth_url = "https://cloud.api.selcloud.ru/identity/v3"
domain_name = "123456"
tenant_id = selectel_vpc_project_v2.project_1.id
user_name = selectel_iam_serviceuser_v1.serviceuser_1.name
password = selectel_iam_serviceuser_v1.serviceuser_1.password
region = "ru-9"
}
Пример файла для создания кластера PostgreSQL TimescaleDB фиксированной конфигурации
resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "subnet_1" {
network_id = openstack_networking_network_v2.network_1.id
cidr = "192.168.199.0/24"
}

data "selectel_dbaas_datastore_type_v1" "datastore_type_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
filter {
engine = "postgresql"
version = "14-TimescaleDB"
}
}

data "selectel_dbaas_flavor_v1" "flavor_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
filter {
datastore_type_id = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
fl_size = "standard"
vcpus = 4
ram = 16384
disk = 128
}
}

resource "selectel_dbaas_postgresql_datastore_v1" "datastore_1" {
name = "datastore-1"
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
type_id = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
subnet_id = selectel_vpc_subnet_v2.subnet.subnet_id
node_count = 3
flavor_id = data.selectel_dbaas_flavor_v1.flavor_1.flavors[0].id
pooler {
mode = "transaction"
size = 50
}
}

resource "selectel_dbaas_user_v1" "user_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_postgresql_datastore_v1.datastore_1.id
name = "user"
password = "secret"
}

resource "selectel_dbaas_postgresql_database_v1" "database_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_postgresql_datastore_v1.datastore_1.id
owner_id = selectel_dbaas_user_v1.user_1.id
name = "database_1"
}
Пример файла для создания кластера PostgreSQL TimescaleDB произвольной конфигурации
resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "subnet_1" {
network_id = openstack_networking_network_v2.network_1.id
cidr = "192.168.199.0/24"
}

data "selectel_dbaas_datastore_type_v1" "datastore_type_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
filter {
engine = "postgresql"
version = "14-TimescaleDB"
}
}

resource "selectel_dbaas_postgresql_datastore_v1" "datastore_1" {
name = "datastore-1"
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
type_id = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
subnet_id = selectel_vpc_subnet_v2.subnet.subnet_id
node_count = 3
flavor {
vcpus = 1
ram = 4096
disk = 32
}
pooler {
mode = "transaction"
size = 50
}
}

resource "selectel_dbaas_user_v1" "user_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_postgresql_datastore_v1.datastore_1.id
name = "user"
password = "secret"
}

resource "selectel_dbaas_postgresql_database_v1" "database_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_postgresql_datastore_v1.datastore_1.id
owner_id = selectel_dbaas_user_v1.user_1.id
name = "database_1"
}

1. Опционально: настроить провайдеры

Если вы настроили провайдеры Selectel и OpenStack, пропустите этот шаг.

  1. Убедитесь, что в панели управления вы создали сервисного пользователя с ролями Администратор аккаунта и Администратор пользователей.

  2. Создайте директорию для хранения конфигурационных файлов и отдельный файл с расширением .tf для настройки провайдеров.

  3. В файл для настройки провайдеров добавьте провайдеры Selectel и OpenStack:

    terraform {
    required_providers {
    selectel = {
    source = "selectel/selectel"
    version = "6.0.0"
    }
    openstack = {
    source = "terraform-provider-openstack/openstack"
    version = "2.1.0"
    }
    }
    }

    Здесь version — версии провайдеров. Актуальную версию можно посмотреть в документации Selectel (в Terraform Registry и GitHub) и OpenStack (в Terraform Registry и GitHub).

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

  4. Инициализируйте провайдер Selectel:

    provider "selectel" {
    domain_name = "123456"
    username = "user"
    password = "password"
    }

    Здесь:

    • domain_name — номер аккаунта Selectel. Можно посмотреть в панели управления в правом верхнем углу;
    • username — имя сервисного пользователя с ролями Администратор аккаунта и Администратор пользователей. Можно посмотреть в панели управления: раздел Управление доступомУправление пользователями → вкладка Сервисные пользователи (раздел доступен только Владельцу аккаунта и Администратору пользователей);
    • password — пароль сервисного пользователя. Можно посмотреть при создании пользователя или изменить на новый.
  5. Создайте проект:

    resource "selectel_vpc_project_v2" "project_1" {
    name = "project"
    }

    Посмотрите подробное описание ресурса selectel_vpc_project_v2.

  6. Создайте сервисного пользователя для доступа к проекту и назначьте ему роль Администратор проекта:

    resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
    name = "username"
    password = "password"
    role {
    role_name = "member"
    scope = "project"
    project_id = selectel_vpc_project_v2.project_1.id
    }
    }

    Здесь:

    • username — имя пользователя;
    • password — пароль пользователя. Пароль должен быть не короче восьми символов и содержать латинские буквы разных регистров и цифры;
    • project_id — ID проекта. Можно посмотреть в панели управления: раздел Облачная платформа → откройте меню проектов (название текущего проекта) → в строке нужного проекта нажмите .

    Посмотрите подробное описание ресурса selectel_iam_serviceuser_v1.

  7. Инициализируйте провайдер OpenStack:

    provider "openstack" {
    auth_url = "https://cloud.api.selcloud.ru/identity/v3"
    domain_name = "123456"
    tenant_id = selectel_vpc_project_v2.project_1.id
    user_name = selectel_iam_serviceuser_v1.serviceuser_1.name
    password = selectel_iam_serviceuser_v1.serviceuser_1.password
    region = "ru-9"
    }

    Здесь:

    • domain_name — номер аккаунта Selectel. Можно посмотреть в панели управления в правом верхнем углу;
    • region — пул, например ru-9. Все ресурсы будут создаваться в этом пуле. Список доступных пулов можно посмотреть в инструкции Матрицы доступности.
  8. Если одновременно с настройкой провайдеров вы создаете ресурсы, то для ресурсов OpenStack добавьте аргумент depends_on. Например, для ресурса openstack_networking_network_v2:

    resource "openstack_networking_network_v2" "network_1" {
    name = "private-network"
    admin_state_up = "true"

    depends_on = [
    selectel_vpc_project_v2.project_1,
    selectel_iam_serviceuser_v1.serviceuser_1
    ]
    }
  9. Опционально: если вы хотите использовать зеркало, создайте отдельный конфигурационный файл Terraform CLI и добавьте в него блок:

    provider_installation {
    network_mirror {
    url = "https://tf-proxy.selectel.ru/mirror/v1/"
    include = ["registry.terraform.io/*/*"]
    }
    direct {
    exclude = ["registry.terraform.io/*/*"]
    }
    }

    Подробнее о настройках зеркал в инструкции CLI Configuration File документации HashiCorp.

  10. Откройте CLI.

  11. Инициализируйте конфигурацию Terraform в директории:

    terraform init
  12. Проверьте, что конфигурационные файлы составлены без ошибок:

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

    terraform fmt
  14. Проверьте, какие ресурсы будут созданы:

    terraform plan
  15. Примените изменения и создайте ресурсы:

    terraform apply
  16. Подтвердите создание — введите yes и нажмите Enter. Созданные ресурсы отобразятся в панели управления.

  17. Если для создания ресурсов оказалось недостаточно квот, увеличьте квоты.

2. Создать приватную сеть и подсеть

resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "subnet_1" {
name = "private-subnet"
network_id = openstack_networking_network_v2.network_1.id
cidr = "192.168.199.0/24"
}

Здесь cidr — CIDR приватной подсети, например 192.168.199.0/24.

Посмотрите подробное описание ресурсов:

3. Создать кластер

data "selectel_dbaas_datastore_type_v1" "datastore_type_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
filter {
engine = "postgresql"
version = "14-TimescaleDB"
}
}

data "selectel_dbaas_flavor_v1" "flavor_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
filter {
datastore_type_id = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
fl_size = "standard"
vcpus = 4
ram = 16384
disk = 128
}
}


resource "selectel_dbaas_postgresql_datastore_v1" "datastore_1" {
name = "datastore-1"
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
type_id = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
subnet_id = openstack_networking_subnet_v2.subnet_1.id
node_count = 3
flavor_id = data.selectel_dbaas_flavor_v1.flavor_1.flavors[0].id
pooler {
mode = "transaction"
size = 50
}
}

Здесь:

  • region — пул, например ru-9. Список доступных пулов можно посмотреть в инструкции Матрицы доступности;
  • filter — фильтр типов облачных баз данных:
    • engine — тип облачных баз данных. Для кластера PostgreSQL TimescaleDB укажите postgresql;
    • version — версия облачной базы данных в формате <номер версии>-TimescaleDB, например 14-TimescaleDB. Список доступных версий можно посмотреть в инструкции Версии и конфигурации;
  • filter — фильтр фиксированных конфигураций кластера. Список доступных конфигураций можно посмотреть в инструкции Версии и конфигурации;
    • fl_size — линейка фиксированных конфигураций. Доступные значения — standard (для линеек Standard, CPU и Memory) и high_freq (для линейки HighFreq);
    • vcpus — количество vCPU;
    • ram — количество RAM в МБ;
    • disk — размер диска в ГБ;
  • nodes_count — количество нод. Максимальное количество нод — 6;
  • pooler — конфигурация пулера соединений:

Посмотрите подробное описание источников данных и ресурсов:

4. Создать пользователя

resource "selectel_dbaas_user_v1" "user_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_postgresql_datastore_v1.datastore_1.id
name = "user"
password = "secret"
}

Здесь:

  • region — пул, в котором находится кластер;
  • name — имя пользователя;
  • password — пароль пользователя.

Посмотрите подробное описание ресурса selectel_dbaas_user_v1.

5. Создать базу данных и назначить владельца

resource "selectel_dbaas_postgresql_database_v1" "database_1" {
project_id = selectel_vpc_project_v2.project_1.id
region = "ru-9"
datastore_id = selectel_dbaas_postgresql_datastore_v1.datastore_1.id
owner_id = selectel_dbaas_user_v1.user_1.id
name = "database_1"
}

Здесь region — пул, в котором находится кластер.

Посмотрите подробное описание ресурса selectel_dbaas_postgresql_database_v1.