Skip to content

Быстрый старт

Руководство для быстрого старта поможет вам начать работу с Terraform:

  1. Научиться удалять ресурсы.

1. Подготовьте окружение

  1. Зарегистрируйтесь в MWS Cloud Platform.
  2. Убедитесь, что вы приглашены в организацию.
  3. Создайте новый проект или выберите существующий.
  4. Создайте сервисный аккаунт и назначьте ему роль editor или выше на проект.

2. Получите аутентификационные данные

  1. Создайте авторизованный ключ для сервисного аккаунта.
  2. Скачайте и сохраните файл с авторизованным ключом.

3. Настройте провайдер

  1. Создайте файл ~/.terraformrc:

  2. Добавьте в файл ~/.terraformrc следующий блок:

    hcl
    provider_installation {
      network_mirror {
        url = "https://storage.mwsapis.ru/mws-terraform/",
        include = ["registry.terraform.io/mws-cloud/*"]
      }
    
      direct {
        exclude = ["registry.terraform.io/mws-cloud/*"]
      }
    }
  3. Создайте директорию для хранения конфигурационных файлов Terraform — например, terraform-config.

  4. Внутри этой директории создайте файл main.tf и добавьте в него следующий блок:

    hcl
    terraform {
      required_providers {
        mws = {
          source = "mws-cloud/mws"
        }
      }
      required_version = ">= 1.11"
    }
    
    provider "mws" {
      service_account_authorized_key_path = "<путь к файлу с авторизованным ключом>"  
      project = "my-project"     # имя проекта
      zone    = "ru-central1-a"  # зона доступности
    }
  5. Инициализируйте Terraform:

    bash
    terraform init

4. Подготовьте план инфраструктуры и создайте ресурсы

В примере описано создание конфигурационного файла Terraform, с помощью которого будут созданы:

  • сеть с именем mynetwork;
  • подсеть с именем mysubnet и CIDR 192.168.0.0/16;
  • виртуальная машина с именем myvm, с двумя ядрами vCPU, 4ГБ RAM, диском размером в 10 ГБ и ОС Ubuntu 22.04. Она получит внутренний IP-адрес из подсети mysubnet;
  • правило файрвола c именем myrule, которое разрешит к доступ к виртуальной машине по SSH.
  1. Создайте сеть и подсеть внутри этой подсети. Для этого добавьте в файл main.tf следующий код:

    hcl
    resource "mws_vpc_network" "network" {
      network = "mynetwork"   # имя сети
    }
    
    resource "mws_vpc_subnet" "subnet" {
      subnet  = "mysubnet"                          # имя подсети
      network = mws_vpc_network.network.network     # ссылка на сеть
      cidr    = "192.168.0.0/16"                    # СIDR
    }
  2. Создайте виртуальную машину. Для этого добавьте в файл main.tf блок кода:

    hcl
    data "mws_compute_image" "image" {
      image   = "mws-ubuntu-2204-lts-v20250529"
      project = "mws-ubuntu"
    }
    
    resource "mws_vpc_address" "vm_primary_network_interface_address" {
      network = mws_vpc_network.network.network
      subnet  = mws_vpc_subnet.subnet.metadata.id
      address = "my-test-vm-primary-network-interface-address"
    }
    
    resource "mws_vpc_external_address" "vm_external_address" {
      external_address = "myvm-external-address"
    }
    
    resource "mws_compute_disk" "disk" {
      disk      = "mydisk"
      disk_type = "diskTypes/nbs-pl2"
      iops      = 1000
      size      = "10GB"
      source = {
        image = data.mws_compute_image.image.metadata.id
      }
    }
    
    resource "mws_compute_virtual_machine" "vm" {
      virtual_machine = "myvm"
      vm_type         = "vmTypes/gen-2-8"
    
      hardware = {
        power                     = "ON"
        graceful_shutdown_timeout = "1m 30s"
      }
    
      os = {
        hostname     = "my"
        local_domain = "vm"
    
        metadata = {
          attributes = {
            user-data = <<-EOF
              #cloud-config
              users:
                - name: myuser
                  groups: sudo
                  shell: /bin/bash
                  sudo: 'ALL=(ALL) NOPASSWD:ALL'
                  ssh_authorized_keys:
                    - ssh-ed25519 AAAAC4YzaC2lDDI1NFE5FFFFIJXzfUIPxeQW+snH3LYn1t++5bdEzdfd+Mdj0h99Ii20 myuser@mycomputer
            EOF
          }
        }
      }
    
      storage = {
        disks = [
          {
            name = "boot"
            boot = true
            disk = {
              ref = mws_compute_disk.disk.metadata.id
            }
          }
        ]
      }
    
      network = {
        network_interfaces = [
          {
            name    = "my-test-vm-network-interface-primary"
            primary = true
            addresses = [
              {
                address = {
                  ref = mws_vpc_address.vm_primary_network_interface_address.metadata.id
                }
                one_to_one_nat = {
                  external = {
                    address = {
                      ref = mws_vpc_external_address.vm_external_address.metadata.id
                    }
                  }
                }
              }
            ]
          }
        ]
      }
    }
  3. Создайте правило файрвола, которое разрешит доступ к созданной ВМ по SSH:

    hcl
    resource "mws_vpc_firewall_rule" "firewall_rule" {
      metadata = {
        display_name = "Allow SSH"
      }
    
      firewall_rule = "myrule"
      network       = mws_vpc_network.network.network
    
      priority  = 1000
      direction = "INGRESS"
      action    = "ALLOW"
    
      source = {
        spec = {
          cidrs = ["0.0.0.0/0"]
        }
      }
    
      destination = {
        spec = {
          cidrs = ["${mws_vpc_address.vm_primary_network_interface_address.status.ip_address}/32"]
        }
      }
    
      proto_ports = ["TCP:22"]
      active      = true
    }

    Файл main.tf с полным описанием конфигурации будет выглядеть так:

    main.tf
    hcl
    terraform {
      required_providers {
        mws = {
          source = "mws-cloud/mws"
        }
      }
      required_version = ">= 1.11"
    }
    
    provider "mws" {
      service_account_authorized_key_path = "<путь к файлу с авторизованным ключом>"
      zone      = "ru-central1-a"
      project   = "<имя проекта>"
    }
    
    resource "mws_vpc_network" "network" {
      network = "mynetwork"
    }
    
    resource "mws_vpc_subnet" "subnet" {
      depends_on = [mws_vpc_network.network]
      subnet     = "mysubnet"
      network    = mws_vpc_network.network.network
      cidr       = "192.168.0.0/16"
    }
    
    resource "mws_vpc_firewall_rule" "firewall_rule" {
      metadata = {
        display_name = "Allow SSH"
      }
    
      firewall_rule = "myrule"
      network       = mws_vpc_network.network.network
    
      priority  = 1000
      direction = "INGRESS"
      action    = "ALLOW"
    
      source = {
        spec = {
          cidrs = ["0.0.0.0/0"]
        }
      }
    
      destination = {
        spec = {
          cidrs = ["${mws_vpc_address.vm_primary_network_interface_address.status.ip_address}/32"]
        }
      }
    
      proto_ports = ["TCP:22"]
      active      = true
    }
    
    data "mws_compute_image" "image" {
      image   = "mws-ubuntu-2204-lts-v20250529"
      project = "mws-ubuntu"
    }
    
    resource "mws_vpc_address" "vm_primary_network_interface_address" {
      network = mws_vpc_network.network.network
      subnet  = mws_vpc_subnet.subnet.metadata.id
      address = "my-test-vm-primary-network-interface-address"
    }
    
    resource "mws_vpc_external_address" "vm_external_address" {
      external_address = "myvm-external-address"
    }
    
    resource "mws_compute_disk" "disk" {
      disk      = "mydisk"
      disk_type = "diskTypes/nbs-pl2"
      iops      = 1000
      size      = "10GB"
      source = {
        image = data.mws_compute_image.image.metadata.id
      }
    }
    
    resource "mws_compute_virtual_machine" "vm" {
      virtual_machine = "myvm"
      vm_type         = "vmTypes/gen-2-8"
    
      hardware = {
        power                     = "ON"
        graceful_shutdown_timeout = "1m 30s"
      }
    
      os = {
        hostname     = "my"
        local_domain = "vm"
    
        metadata = {
          user-data = <<-EOF
            #cloud-config
            users:
              - name: myuser
                groups: sudo
                shell: /bin/bash
                sudo: 'ALL=(ALL) NOPASSWD:ALL'
                ssh_authorized_keys:
                  - ssh-ed25519 AAAAC4YzaC2lDDI1NFE5FFFFIJXzfUIPxeQW+snH3LYn1t++5bdEzdfd+Mdj0h99Ii20 myuser@mycomputer
          EOF
        }
      }
    
      storage = {
        disks = [
          {
            name = "boot"
            boot = true
            disk = {
              ref = mws_compute_disk.disk.metadata.id
            }
          }
        ]
      }
    
      network = {
        network_interfaces = [
          {
            name    = "myvm-network-interface-primary"
            primary = true
            addresses = [
              {
                address = {
                  ref = mws_vpc_address.vm_primary_network_interface_address.metadata.id
                }
                one_to_one_nat = {
                  external = {
                    address = {
                      ref = mws_vpc_external_address.vm_external_address.metadata.id
                    }
                  }
                }
              }
            ]
          }
        ]
      }
    }
  4. Проверьте конфигурационный файл на наличие синтаксических ошибок:

    bash
    terraform validate

    Если ошибок нет, вы получите следующее сообщение:

    bash
    Success! The configuration is valid.
  5. Выполните команду:

    bash
    terraform plan

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

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

    bash
    terraform apply

    Подтвердите выполнение операций: введите слово yes и нажмите Enter.

    Во время создания ресурсов Terraform будет выводить краткие сообщения о выполняемых операциях. Проверить, что ресурсы созданы и настроены корректно, можно в веб-консоли.

5. Удалите ресурсы

Ресурсы, созданные с помощью Terraform, могут тарифицироваться. Не забудьте удалить ресурсы, если вы создали их в тестовых целях, и они вам больше не нужны.

Чтобы удалить ресурсы:

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

    bash
    terraform destroy
  2. Подтвердите удаление: введите слово yes и нажмите Enter.