Развёртывание инфраструктуры для кластера YDB с помощью Terraform
- Обзор разворачиваемой инфраструктуры
- Создание инфраструктуры в AWS для развертывания YDB кластера
- Создание инфраструктуры в Azure для развертывания YDB кластера
- Создание инфраструктуры в Google Cloud Platform для развертывания YDB кластера
- Создание инфраструктуры в Yandex Cloud для развертывания YDB кластера
Развернуть кластер YDB для использования в production можно тремя рекомендованными способами: с помощью Ansible, Kubernetes или вручную. Если вариант с Kubernetes практически самодостаточен, то для вариантов с Ansible и вручную нужен SSH-доступ к правильно сконфигурированным серверам или виртуальным машинам.
В статье описывается, как создать и настроить необходимый для работы кластера YDB набор виртуальных машин у различных облачных провайдеров с помощью Terraform.
Terraform – это программное обеспечение с открытым исходным кодом для управления инфраструктурой по модели «инфраструктура как код» (Infrastructure as Code). Такой же подход используется в Ansible, системе управления конфигурациями. Terraform и Ansible работают на разных уровнях: Terraform управляет инфраструктурой, а Ansible настраивает окружения на ВМ:

Конфигурация настройки окружения ВМ описывается в YAML-формате, а инфраструктурный код пишется на HCL (язык конфигурации Terraform). Основной логической единицей записи в HCL является «блок». Блок состоит из ключевого слова, идентифицирующего его тип, названия и фигурных скобок, обозначающих тело блока. Например, так может выглядеть блок управления виртуальным сервером в AWS:
resource "aws_instance" "ydb-vm" {
count = var.instance_count
ami = "ami-008fe2fc65df48dac"
instance_type = "t2.micro"
key_name = var.req_key_pair
vpc_security_group_ids = [var.input_security_group_id]
subnet_id = element(var.input_subnet_ids, count.index % length(var.input_subnet_ids))
tags = {
Name = "ydb-node-${count.index +1}"
Username = "ubuntu"
}
}
Блоки могут располагаться друг за другом в одном файле и быть независимыми, могут ссылаться друг на друга и быть зависимыми, а также могут вкладываться друг в друга.
Основные типы блоков:
resource– блок инициализации ресурса инфраструктуры (ВМ, сеть, подсеть, диск, DNS-зона и т.д.);provider– блок инициализации провайдера, версии API и данных для аутентификации;variable– переменная как со значением по умолчанию, так и пустая для хранения данных, введённых пользователем или переданных другими блоками;output– вывод данных в терминал и сохранение в переменной;data– переменная для запроса данных от внешних облачных ресурсов, не представленных в создаваемой инфраструктуре;module– логическая группировка ресурсов, которые можно переиспользовать несколько раз в рамках одного или разных проектов;terraform– блок настройки поведения самого Terraform, включая версию Terraform и используемых провайдеров, а также настройки бэкенда, который используется для хранения состояния Terraform.
Блоки записываются в файлы с расширением .tf и логически группируются в директориях, которые в терминологии Terraform называют модулями. Модуль обычно состоит из следующих файлов:
main.tf– основной файл, в котором находится код инфраструктуры. Может быть несколько файлов, содержащих инфраструктурный код.variables.tf– локальные переменные модуля, которые принимают данные от других модулей или имеют значения по умолчанию.outputs.tf– переменные, которые содержат результаты работы ресурса (IP-адреса ВМ, ID сетей/подсетей и т.д.).
Модули подключаются к проекту в корневом файле main.tf следующим образом:
module "vpc" {
source = "./modules/vpc"
subnets_count = var.subnets_count
subnets_availability_zones = var.availability_zones
}
В примере подключается модуль vpc (имя модуля назначается при подключении). Обязательный параметр – это source, путь к директории, где располагается модуль. subnets_count и subnets_availability_zones – это переменные внутри модуля vpc, которые принимают значения из переменных глобального уровня var.subnets_count и var.availability_zones.
Модули, как и блоки, располагаются друг за другом в корневом main.tf проекта. Основное преимущество модульного подхода организации проекта – возможность легко управлять логически связанными наборами ресурсов. Поэтому репозиторий с готовыми Terraform-сценариями организован следующим образом:
.
├── README.md
├── README_RU.md
├── aws
│ ├── README.md
│ ├── README_RU.md
│ ├── main.tf
│ ├── modules
│ │ ├── dns
│ │ ├── eip
│ │ ├── instance
│ │ ├── key_pair
│ │ ├── security
│ │ └── vpc
│ └── variables.tf
├── azure
│ ├── README.md
│ ├── README_RU.md
│ ├── main.tf
│ ├── modules
│ │ ├── dns
│ │ ├── resource_group
│ │ ├── security
│ │ ├── vm
│ │ └── vpc
│ └── variables.tf
├── ...
Поддиректории содержат два readme, файл variables.tf с локальными переменными модуля и основной файл main.tf, который подключает модули из поддиректории modules. Набор модулей зависит от облачного провайдера. Базовые модули, функционально одинаковые для всех провайдеров, имеют одинаковые названия:
vpc– модуль управления облачной сетью и подсетями;dns– модуль управления DNS-зоной и DNS-записями;security– модуль управления группами безопасности;instance– модуль управления ВМ.
Чтобы воспользоваться готовыми Terraform-сценариями из репозитория, нужно скачать репозиторий командой git clone https://github.com/ydb-platform/ydb-terraform.git, внести изменения в конфигурационный файл Terraform ~/.terraformrc, задать актуальные значения глобальных переменных сценария и скачать CLI того облачного провайдера, где будет создана инфраструктура.
Если вы планируете использовать несколько провайдеров, можно добавить следующий код в ~/.terraformrc, который установит пути скачивания для всех провайдеров, описанных ниже:
provider_installation {
network_mirror {
url = "https://terraform-mirror.yandexcloud.net/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
exclude = ["terraform.storage.ydb.tech/*/*"]
}
Если уже используются Terraform-провайдеры, представленные в официальном репозитории, они продолжат работать.
Обзор разворачиваемой инфраструктуры
Далее приведены пошаговые инструкции создания инфраструктуры в AWS, Azure, GCP, Yandex Cloud. Предложенные примеры Terraform-сценариев развертывают однотипную инфраструктуру:
- Виртуальные машины в трёх зонах доступности;
- Облачная сеть, публичные и приватные подсети (по подсети на зону доступности);
- Приватная DNS-зона;
- Группы безопасности, разрешающие ICMP и трафик на портах: 22, 65535, 19001, 8765, 2135.
Большинство параметров кластера регулируются (количество ВМ, объём и тип подключаемого диска, количество сетей, домен DNS-зоны и т.д.), однако значения по умолчанию являются минимально рекомендованными. Их изменение в меньшую сторону может привести к проблемам.
Создание инфраструктуры в AWS для развертывания YDB кластера
Создайте аккаунт в AWS и пополните баланс на сумму, достаточную для работы 9 ВМ. Рассчитать примерную стоимость содержания инфраструктуры в зависимости от региона и прочих обстоятельств можно с помощью калькулятора.
Создайте пользователя и ключ подключения в AWS Cloud для работы AWS CLI:
- Пользователь создаётся в разделе Security credentials → Access management → Users → Create User.
- На следующем шаге нужно назначить права пользователю. Выберете
AmazonEC2FullAccess. - После создания пользователя – перейдите в него, откройте вкладку
Security credentialsи нажмите кнопку Create access key в секции Access keys. - Из предложенных вариантов наборов опций выберете
Command Line Interface. - Далее придумайте тег для разметки ключа и нажмите кнопку Create access key.
- Скопируйте значения полей
Access keyиSecret access key.
Установите AWS CLI и выполните команду aws configure. Введите значения полей Access key и Secret access key сохраненные ранее. Отредактируйте файлы ~/.aws/credentials и ~/.aws/config следующим образом:
- Добавьте
[AWS_def_reg]в~/.aws/configпередregion = .... - Добавьте
[AWS]перед секретной информацией о ключах подключения.
Перейдите в директорию aws в скачанном репозитории и отредактируйте следующие переменные в файле variable.tf:
aws_region– регион, в котором будет развернута инфраструктура.aws_profile– имя профиля безопасности из файла~/.aws/credentials.availability_zones– список зон доступности региона. Формируется из названия региона и порядковой буквы. Например, для регионаus-west-2список зон доступности будет выглядеть так:["us-west-2a", "us-west-2b", "us-west-2c"].
Теперь, находясь в поддиректории aws, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:
terraform init– установка провайдера и инициализация модулей.terraform plan– создание плана будущей инфраструктуры.terraform apply(повторное выполнение) – создание ресурсов в облаке.
Далее используются команды terraform plan, terraform apply и terraform destroy (уничтожение созданной инфраструктуры).
Создание инфраструктуры в Azure для развертывания YDB кластера
Создайте аккаунт в Azure и пополните счёт аккаунта на сумму, достаточную для работы девяти ВМ. Рассчитать примерную стоимость содержания инфраструктуры в зависимости от региона и прочих обстоятельств можно с помощью калькулятора.
Аутентификация в провайдере Azure для Terraform осуществляется через CLI:
- Скачать, установить и настроить Azure CLI можно, следуя этой инструкции.
- Авторизоваться в Azure с помощью Azure CLI можно в интерактивном режиме командой
az login, а для создания пары SSH-ключей (Linux, macOS) проще всего будет воспользоваться командойssh-keygen.
После авторизации в Azure и генерации SSH-ключей нужно изменить дефолтное значение следующих переменных в корневом файле variables.tf:
auth_location– название региона, где будет развернута инфраструктура. Список доступных регионов в зависимости от подписки можно получить командойaz account list-locations | grep "displayName".ssh_key_path– путь к публичной части сгенерированного SSH-ключа.
Теперь, находясь в поддиректории azure, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:
terraform init– установка провайдера и инициализация модулей.terraform plan– создание плана будущей инфраструктуры.terraform apply(повторное выполнение) – создание ресурсов в облаке.
Далее используются команды terraform plan, terraform apply и terraform destroy (уничтожение созданной инфраструктуры).
Создание инфраструктуры в Google Cloud Platform для развертывания YDB кластера
Зарегистрируйтесь в Google Cloud Console и создайте проект. Активируйте платежный аккаунт и пополните его средствами для запуска девяти ВМ. Рассчитать стоимость можно в калькуляторе.
Настройте GCP CLI:
- Актируйте Compute Engine API и Cloud DNS API.
- Скачайте и установите GCP CLI, следуя этой инструкции.
- Перейдите в поддиректорию
.../google-cloud-sdk/binи выполните команду./gcloud compute regions listдля получения списка доступных регионов. - Выполните команду
./gcloud auth application-default loginдля настройки профиля подключения.
Перейдите в поддиректорию gcp (находится в скаченном репозитории) и в файле variables.tf задайте актуальные значения следующим переменным:
project– название проекта, которое было задано в облачной консоли Google Cloud.region– регион, где будет развернута инфраструктура.zones– список зон доступности, в которых будут созданы подсети и ВМ.
Теперь, находясь в поддиректории gcp, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:
terraform init– установка провайдера и инициализация модулей.terraform plan– создание плана будущей инфраструктуры.terraform apply(повторное выполнение) – создание ресурсов в облаке.
Далее используются команды terraform plan, terraform apply и terraform destroy (уничтожение созданной инфраструктуры).
Создание инфраструктуры в Yandex Cloud для развертывания YDB кластера
Для создания инфраструктуры в Yandex Cloud с помощью Terraform нужно:
-
Подготовить облако к работе:
- Зарегистрироваться в Yandex Cloud.
- Подключить платежный аккаунт.
- Убедится в наличии достаточного количества средств для создания девяти ВМ.
-
Установить и настроить Yandex Cloud CLI:
-
Создать сервисный аккаунт с помощью CLI.
-
Сгенерировать авторизованный ключ в JSON формате для подключения Terraform к облаку с помощью CLI:
yc iam key create --service-account-name <acc name> --output <file name> --folder-id <cloud folder id>. В терминал будет выведена информация о созданном ключе:id: ajenap572v8e1l... service_account_id: aje90em65r69... created_at: "2024-09-03T15:34:57.495126296Z" key_algorithm: RSA_2048Авторизованный ключ будет создан в директории, где вызывалась команда.
-
Настроить Yandex Cloud Terraform провайдера.
-
Скачать данный репозиторий командой
git clone https://github.com/ydb-platform/ydb-terraform.git. -
Перейти в директорию
yandex_cloud(директория в скаченном репозитории) и внести изменения в следующие переменные, в файлеvariables.tf:key_path– путь к сгенерированному авторизованному ключу с помощью CLI.cloud_id– ID облака. Можно получить список доступных облаков командойyc resource-manager cloud list.folder_id– ID Cloud folder. Можно получить командойyc resource-manager folder list.
Теперь, находясь в поддиректории yandex_cloud, можно выполнить последовательность следующих команд для установки провайдера, инициализации модулей и создания инфраструктуры:
terraform init– установка провайдера и инициализация модулей.terraform plan– создание плана будущей инфраструктуры.terraform apply(повторное выполнение) – создание ресурсов в облаке.
Далее используются команды terraform plan, terraform apply и terraform destroy (уничтожение созданной инфраструктуры).
Примечание
С помощью Yandex Cloud провайдера можно не только создавать инфраструктуру для дальнейшего развертывания на ней YDB кластера с помощью Ansible, но и управлять serverless или dedicated версией YDB прямо из Terraform. О возможностях работы с YDB в Yandex Cloud читайте в разделе Работа с YDB через Terraform документации Yandex Cloud.