Создать кластер PostgreSQL TimescaleDB
Мы рекомендуем создавать ресурсы по порядку. Если вы создаете все ресурсы единовременно, Terraform будет учитывать зависимости между ресурсами, которые вы указали в конфигурационном файле. Если зависимости не указаны, ресурсы будут создаваться параллельно, что может приводить к ошибкам. Например, ресурс, который требуется для создания другого ресурса, может быть еще не создан.
- Опционально: настройте провайдеры.
- Создайте приватную сеть и подсеть.
- Создайте кластер.
- Создайте пользователя.
- Создайте базу данных и назначьте в ладельца.
Конфигурационные файлы
Пример файла для настройки провайдеров
terraform {
  required_providers {
    selectel  = {
      source  = "selectel/selectel"
      version = "~> 6.0"
    }
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "2.1.0"
    }
  }
}
provider "selectel" {
  domain_name = "123456"
  username    = "user"
  password    = "password"
  auth_region = "ru-9"
  auth_url    = "https://cloud.api.selcloud.ru/identity/v3/"
}
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, пропустите этот шаг.
- 
Убедитесь, что в панели управления вы создали сервисного пользователя с ролями memberв области доступа Аккаунт иiam_admin.
- 
Создайте директорию для хранения конфигурационных файлов и отдельный файл с расширением .tfдля настройки провайдеров.
- 
В файл для настройки провайдеров добавьте провайдеры Selectel и OpenStack: terraform {
 required_providers {
 selectel = {
 source = "selectel/selectel"
 version = "~> 6.0"
 }
 openstack = {
 source = "terraform-provider-openstack/openstack"
 version = "2.1.0"
 }
 }
 }Здесь version— версии провайдеров. Актуальную версию можно посмотреть в документации Selectel (в Terraform Registry и GitHub) и OpenStack (в Terraform Registry и GitHub).Подробнее о продуктах, услугах и сервисах, которыми можно управлять с помощью провайдеров, в инструкции Провайдеры Selectel и OpenStack. 
- 
Инициализируйте провайдер Selectel: provider "selectel" {
 domain_name = "123456"
 username = "user"
 password = "password"
 auth_region = "ru-9"
 auth_url = "https://cloud.api.selcloud.ru/identity/v3/"
 }Здесь: - domain_name— номер аккаунта Selectel. Можно посмотреть в панели управления в правом верхнем углу;
- username— имя сервисного пользователя с ролями- memberв области доступа Аккаунт и- iam_admin. Можно посмотреть в панели управления: в верхнем меню нажмите Аккаунт → раздел Сервисные пользователи (раздел доступен только Владельцу аккаунта и пользователю с ролью- iam_admin);
- password— пароль сервисного пользователя. Можно посмотреть при создании пользователя или изменить на новый;
- auth_region— пул для авторизации, например- ru-9. Создавать ресурсы можно в других пулах. Список доступных пулов можно посмотреть в инструкции Матрицы доступности.
 
- 
Создайте проект: resource "selectel_vpc_project_v2" "project_1" {
 name = "project"
 }Посмотрите подробное описание ресурса selectel_vpc_project_v2. 
- 
Создайте сервисного пользователя для доступа к проекту и назначьте ему роль memberв области доступа Проект: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. 
- 
Инициализируйте провайдер 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. Все ресурсы будут создаваться в этом пуле. Список доступных пулов можно посмотреть в инструкции Матрицы доступности.
 
- 
Если одновременно с настройкой провайдеров вы создаете ресурсы, то для ресурсов 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
 ]
 }
- 
Опционально: если вы хотите использовать зеркало, создайте отдельный конфигурационный файл 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. 
- 
Откройте CLI. 
- 
Инициализируйте конфигурацию Terraform в директории: terraform init
- 
Проверьте, что конфигурационные файлы составлены без ошибок: terraform validate
- 
Отформатируйте конфигурационные файлы: terraform fmt
- 
Проверьте, какие ресурсы будут созданы: terraform plan
- 
Примените изменения и создайте ресурсы: terraform apply
- 
Подтвердите создание — введите yes и нажмите Enter. Созданные ресурсы отобразятся в панели управления. 
- 
Если для создания ресурсов оказалось недостаточно квот, увеличьте квоты. 
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— конфигурация пулера соединений:- mode— режим пулинга;
- size— размер пула.
 
Посмотрите подробное описание источников данных и ресурсов:
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  = openstack_networking_subnet_v2.subnet_1.id
  node_count = 3
  flavor {
    vcpus = 1
    ram   = 4096
    disk  = 32
  }
  pooler {
    mode = "transaction"
    size = 50
  }
}
Здесь:
- region— пул, например- ru-9. Список доступных пулов можно посмотреть в инструкции Матрицы доступности;
- filter— фильтр типов облачных баз данных:- engine— тип облачных баз данных. Для кластера PostgreSQL TimescaleDB укажите- postgresql;
- version— версия облачной базы данных в формате- <номер версии>-TimescaleDB, например- 14-TimescaleDB. Список доступных версий можно посмотреть в инструкции Версии и конфигурации;
 
- nodes_count— количество нод. Максимальное количество нод — 6;
- flavor— произвольная конфигурация кластера. Доступные значения произвольных конфигураций можно посмотреть в инструкции Версии и конфигурации:- vcpus— количество vCPU;
- ram— количество RAM в МБ;
- disk— размер диска в ГБ;
 
- pooler— конфигурация пулера соединений:- mode— режим пулинга;
- size— размер пула.
 
Посмотрите подробное описание источника данных selectel_dbaas_datastore_type_v1 и ресурса selectel_dbaas_postgresql_datastore_v1.
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.