Поиск по сайту:

Развертывание виртуальных машин Azure с помощью Terraform для экономии денег


Большинство из нас сделали это — развернули временные виртуальные машины в Azure. Что-то, что многие из нас также сделали, это забыть удалить ресурсы, прикрепленные к этим виртуальным машинам, при их удалении. Это может привести к нежелательным расходам до нескольких тысяч долларов, если вы не будете осторожны.

В этой статье мы узнаем, как развернуть виртуальные машины в Azure и удалить все их следы, когда мы закончим, с помощью Terraform.

Предпосылки

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

  • Установите Azure CLI.
  • Быть администратором подписки Azure (или аналогичной), что позволяет использовать ее для создания групп ресурсов и ресурсов.

С этим покончено, давайте начнем с загрузки и установки Terraform.

Установка Терраформ

Terraform можно установить несколькими способами. В Windows проще всего использовать choco:

choco install terraform

На Macintosh это доступно с помощью Brew:

brew install terraform

Дополнительные сведения об установке Terraform доступны в документации Terraform.

Предполагая, что установка прошла успешно, вы можете убедиться, что она работает, выполнив команду terraform version.

Теперь, когда вы убедились, что terraform работает на вашем компьютере, пришло время пройти аутентификацию в подписке Azure через Azure CLI.

Аутентификация

Чтобы пройти аутентификацию и настроить подписку в Azure CLI, вам необходимо войти в систему. Откройте терминал и введите:

az login

А затем, после аутентификации, перечислите все свои подписки, введя:

az account list

Если у вас есть несколько доступных подписок, скопируйте идентификатор подписки нужной и введите:

az account set --subscription="COPIED_SUBSCRIPTION_ID"

Теперь вы настроили Azure CLI для использования вашей подписки. (Это подписка, которую terraform будет использовать позже.) Пришло время создать шаблон terraform, который мы будем использовать для развертывания нашей виртуальной машины.

Создание шаблона Terraform

Шаблон Terraform представляет собой простой текстовый файл с расширением .tf. Он имеет синтаксис, подобный JSON, и может быть легко прочитан и сгенерирован. Шаблон состоит в основном из двух частей: поставщиков (которые обрабатывают связь со службой, в которой вы хотите выполнить развертывание), и ресурсов, которые создает поставщик.

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

Теперь откройте этот файл в своем любимом текстовом редакторе и добавьте провайдера:

provider "azurerm" {
  version   = "=2.11.0"
	features {}  
}

Это сообщит Terraform, что вы хотите использовать поставщика AzureRM (для создания ресурсов Azure) и что он должен иметь версию 2.11. Важно указать номер версии, поскольку функциональные возможности разных версий могут сильно различаться.

После того, как вы записали это в текстовый файл, пришло время добавить нашу группу ресурсов Azure. Это также рассматривается Terraform как ресурс:

resource "azurerm_resource_group" "resourcegroup" {
        name = "test-vm"
        location = "westus"
        tags = {
            project = "some_test_project"
        }
}

Приведенный выше код создает группу ресурсов с именем «test-vm», расположенную в западной части США. Он также добавляет тег с названием проекта.

Для успешного запуска виртуальной машины нам также нужна сеть. А поскольку Terraform создан для инфраструктуры как кода (IaC), он также доступен в качестве ресурса:

resource "azurerm_virtual_network" "network" {
    name                = "${azurerm_resource_group.resourcegroup.name}-network"
    address_space       = ["10.0.0.0/16"]
    location            = azurerm_resource_group.resourcegroup.location
    resource_group_name = azurerm_resource_group.resourcegroup.name

    tags = azurerm_resource_group.resourcegroup.tags
}

Это создает виртуальную сеть. Он также использует переменную в параметре name. Если вы посмотрите внимательно, то увидите, что это относится к группе ресурсов, которую мы определили выше:

"${azurerm_resource_group.resourcegroup.name}-network"

Это означает, что виртуальной сети будет присвоено имя test-vm-network. Мы делаем то же самое для местоположения, имени группы ресурсов и тегов.

Далее пришло время определить подсеть, в которую мы поместим виртуальную машину, используя те же методы с использованием переменных, что и раньше:

resource "azurerm_subnet" "subnet" {
    name                 = "${azurerm_resource_group.resourcegroup.name}-subnet"
    resource_group_name  = azurerm_resource_group.resourcegroup.name
    virtual_network_name = azurerm_virtual_network.network.name
    address_prefix       = "10.0.2.0/24"
}

Это создает подсеть с именем test-vm-subnet.

Теперь давайте определим сетевую карту, которую также будет использовать виртуальная машина:

resource "azurerm_network_interface" "vm1-nic" {
    name                        = "vm1-NIC"
    location                    = azurerm_resource_group.resourcegroup.location
    resource_group_name         = azurerm_resource_group.resourcegroup.name

    ip_configuration {
        name                          = "vm1-NicConfiguration"
        subnet_id                     = "${azurerm_subnet.subnet.id}"
        private_ip_address_allocation = "static"
        private_ip_address            = "10.0.2.4"
    }

    tags = azurerm_resource_group.resourcegroup.tags
}

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

И, наконец, что не менее важно, определение самой ВМ:

resource "azurerm_virtual_machine" "vm-1" {
  name                  = "vm1"
  location              = "${azurerm_resource_group.resourcegroup.location}"
  resource_group_name   = "${azurerm_resource_group.resourcegroup.name}"
  network_interface_ids = ["${azurerm_network_interface.vm1-nic.id}"]
  vm_size               = "Standard_B1ms"

  delete_os_disk_on_termination = true

  storage_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2019-Datacenter"
    version   = "latest"
  }
  storage_os_disk {
    name              = "vm1-osdisk"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }
  os_profile {
    computer_name  = "vm-1"
    admin_username = "demoadmin"
    admin_password = "$om3s3cretPassWord"
  }

  os_profile_windows_config {
      enable_automatic_upgrades = "true"
      provision_vm_agent = "true"
  }

  tags = azurerm_resource_group.resourcegroup.tags
}

Приведенный выше код подготовит виртуальную машину Azure под управлением Windows Server 2019, используя ресурсы, которые мы определили ранее. У него будет администратор с именем пользователя «demoadmin», у которого есть пароль «$om3s3cretPassWord». Остальные параметры говорят сами за себя, и вы можете найти гораздо больше в Terraform AzureRM. документация.

Теперь осталось сохранить файл .tf, развернув этот шаблон в Azure с помощью TerraForm!

Инициация и развертывание с помощью TerraForm

Теперь, когда у нас есть шаблон, откройте терминал и перейдите в каталог, в котором вы сохранили файл .tf:

cd c:tempterraform

Теперь мы должны запустить TerraForm. Это загрузит модуль ресурсов для AzureRM и исправит ошибки в файле .tf:

После завершения инициализации вы готовы применить шаблон, запустив terraform apply.

terraform apply

Теперь TerraForm создаст новую группу ресурсов в Azure, сети, подсети и, в конечном итоге, саму виртуальную машину. Состояние и все созданные им ресурсы хранятся в папке .terraform вашего текущего каталога. Поэтому не удаляйте эту папку, если вы хотите удалить ресурсы позже!

После того, как вы закончите работу с тестовой виртуальной машиной и захотите ее уничтожить, просто запустите:

terraform destroy

Это удалит все диски, сетевые карты, подсети, группы ресурсов и т. д., созданные при запуске terraform apply, и вам не придется беспокоиться о том, что вы забыли удалить фрагменты, оставшиеся с точки зрения ресурсов Azure. .

Заключение

Использование TerraForm только для второстепенных задач, подобных этой, невероятно удобно. Это доказывает, что вам не обязательно иметь полностью реализованную инфраструктуру как код (IaC), чтобы использовать ее продуктивно. Это также снижает затраты за счет удаления неиспользуемых ресурсов в Azure. Надеюсь, это оказалось полезным для вас, и вы даже начали свой путь к IaC!