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

Развертывание виртуальной машины с помощью Terraform в Cloud.ru Evolution

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

С помощью этого руководства вы научитесь автоматически развертывать инфраструктуру в Cloud.ru Evolution при помощи Terraform.

Вы создадите виртуальную машину с плавающим публичным IP-адресом и сможете подключиться к ней по SSH со своего устройства.

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

  • «Виртуальные машины» — сервис, в рамках которого предоставляется виртуальная машина.

  • «Публичные IP» — сервис для организации доступа.

  • «Подсети» — часть облачной сети, которая изолирована от других подобных сетей.

  • «Группы безопасности» — сервис для контроля трафика виртуальных машин.

  • Terraform — инструмент для управления инфраструктурой как кодом (Infrastructure as Code).

Шаги:

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

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

  2. Создайте сервисный аккаунт для управления облачными ресурсами.

  3. Создайте ключ доступа для аутентификации сервисного аккаунта в API Cloud.ru. Сохраните Key ID (логин) и Key Secret (пароль).

  4. Скопируйте идентификатор проекта, в котором будете разворачивать ресурсы.

  5. Сгенерируйте ключевую пару для подключения к серверу по SSH:

    1. Выполните команду:

      ssh-keygen -t ed25519 -f id_ed25519 -N ""
    2. Выведите на экран и скопируйте публичный ключ id_ed25519.pub:

      cat id_ed25519.pub
  6. В этом практическом руководстве доступ к ВМ по SSH будет ограничен IP-адресом вашего компьютера. Узнайте его, например, при помощи сервиса https://2ip.ru/.

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

На этом шаге вы установите Terraform и провайдер.

  1. Если не удается скачать Terraform с сайта Hashicorp, скачайте дистрибутив Terraform из зеркала Cloud.ru.

  2. Если вы загрузили дистрибутив Terraform из зеркала, добавьте в переменную PATH путь к папке с исполняемым файлом:

    export PATH=$PATH:<path>

    Где <path> — путь к исполняемому файлу Terraform.

  3. Не выполняйте команду  terraform init — вы выполните ее далее.

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

На этом шаге вы опишете конфигурацию инфраструктуры, которую будет создавать Terraform.

  1. Создайте директорию для конфигурационных файлов и перейдите в нее:

    mkdir terraform && cd terraform
  2. Создайте файл main.tf с конфигурацией провайдера:

    terraform {
    required_providers {
    cloudru = {
    source = "cloud.ru/cloudru/cloud"
    version = "1.6.0"
    }
    }
    }
    provider "cloudru" {
    project_id = "<your_project_id>"
    auth_key_id = "<your_key_id>"
    auth_secret = "<your_key_secret>"
    iam_endpoint = "iam.api.cloud.ru:443"
    k8s_endpoint = "mk8s.api.cloud.ru:443"
    evolution_endpoint = "https://compute.api.cloud.ru"
    cloudplatform_endpoint = "organization.api.cloud.ru:443"
    dbaas_endpoint = "dbaas.api.cloud.ru:443"
    }

    Где:

    • <your_project_id> — идентификатор проекта в Cloud.ru Evolution.

    • <your_key_id> — Key ID (логин), который вы скопировали ранее.

    • <your_key_secret> — Key Secret (пароль), который вы скопировали ранее.

  3. Создайте файл vm.tf с конфигурацией создаваемых ресурсов:

    #Create security group
    resource "cloudru_evolution_security_group" "test_tf_sg" {
    name = "test_tf_s_group"
    description = "Security group for ingress SSH traffic only"
    availability_zone {
    id = "7c99a597-8516-494f-a2c7-d7377048681e" # = AZ1
    }
    #Allow all egress traffic
    rules {
    direction = "egress"
    ether_type = "IPv6"
    ip_protocol = "any"
    port_range = "any"
    remote_ip_prefix = "::/0"
    }
    #Allow all egress traffic
    rules {
    direction = "egress"
    ether_type = "IPv4"
    ip_protocol = "any"
    port_range = "any"
    remote_ip_prefix = "0.0.0.0/0"
    }
    #Allow ingress traffic from your computer via SSH 22 port
    rules {
    direction = "ingress"
    ether_type = "IPv4"
    ip_protocol = "tcp"
    port_range = "22:22"
    remote_ip_prefix = "<your_computer_ip>/32"
    description = "SSH"
    }
    }
    #Create public IP-address to connect to VM from the Internet
    resource "cloudru_evolution_fip" "fip" {
    name = "tf_test_fip"
    description = "Floating IP-address for test VM"
    availability_zone {
    id = "7c99a597-8516-494f-a2c7-d7377048681e" # = AZ1
    }
    }
    #Create subnet for VM interface
    resource "cloudru_evolution_subnet" "test_tf_subnet" {
    name = "test_tf_subnet"
    description = "Subnet to connect VM with public IP-adress"
    subnet_address = "10.10.2.0/24"
    default_gateway = "10.10.2.1"
    routed_network = true
    dns_servers = ["8.8.8.8"]
    availability_zone {
    id = "7c99a597-8516-494f-a2c7-d7377048681e" # = AZ1
    }
    }
    #Create VM
    resource "cloudru_evolution_compute" "test_tf_compute" {
    name = "test_compute"
    flavor_id = "22c9e630-2e31-4792-91d5-bc095386836d" # = low_1_1
    description = "Test VM created via Terraform"
    availability_zone {
    name = "ru.AZ-1"
    }
    image {
    name = "ubuntu-22.04"
    host_name = "test-host"
    user_name = "test-user"
    public_key = "<your_ssh_key>"
    }
    boot_disk {
    name = "test_disk"
    size = 10
    disk_type {
    id = "a859e3dc-6b14-42a8-9bcc-890fde0ba6d0" # = SSD
    }
    }
    network_interfaces {
    subnet {
    name = cloudru_evolution_subnet.test_tf_subnet.name
    }
    security_groups {
    id = cloudru_evolution_security_group.test_tf_sg.id
    }
    fip {
    id = cloudru_evolution_fip.fip.id
    }
    }
    depends_on = [
    cloudru_evolution_security_group.test_tf_sg,
    cloudru_evolution_fip.fip,
    cloudru_evolution_subnet.test_tf_subnet
    ]
    }

Где:

  • availability_zone

    , в которой размещен ресурс. Вы можете указать зону через идентификатор, название или источник данных:

    • id = "7c99a597-8516-494f-a2c7-d7377048681e"

    • name = "ru.AZ-1"

    • id = cloudru_evolution_availability_zone.azs.id — идентификатор указывается через источник данных.

  • flavor_id — идентификатор флейвора. Узнать список доступных флейворов и их идентификаторы вы можете, выполнив API-запрос GET /api/v1/flavors.

  • disk_type — идентификатор типа диска. Узнать список доступных типов дисков и их идентификаторы вы можете, выполнив API-запрос GET /api/v1/disk-types.

  • <your_computer_ip> — IP-адрес вашего компьютера для подключения к ВМ по SSH.

  • <your_ssh_key> — публичный ключ: содержимое файла id_ed25519.pub.

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

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

    terraform init

    Если все прошло успешно, появится сообщение:

    Terraform has been successfully initialized!
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
  2. Проверьте корректность конфигурационных файлов с помощью команды:

    terraform validate

    Если файлы корректные, появится сообщение:

    Success! The configuration is valid.
  3. Для предварительного просмотра изменений инфраструктуры выполните команду:

    terraform plan

    В терминале появится список ресурсов с параметрами. На этом этапе изменения не будут внесены.

  4. Примените изменения инфраструктуры, описанные в конфигурации Terraform:

    terraform apply
  5. Подтвердите изменения: введите yes и нажмите Enter.

  6. Проверьте создание ресурсов:

    1. Убедитесь, что в личном кабинете на странице Инфраструктура → Виртуальные машины отображается виртуальная машина test_compute в статусе «Запущена».

    2. Чтобы проверить доступность и корректность развертывания ВМ, подключитесь к ней по SSH.

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

Виртуальная машина и публичный IP-адрес тарифицируются.

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

terraform destroy

Результат

Вы познакомились с механизмом развертывания облачных ресурсов с помощью Terraform и научились работать с инструментами в рамках концепции IaC (Infrastructure as Code).