Terraform - запуск виртуальной машины Azure из моментального снимка

Я пытаюсь использовать Terraform для запуска виртуальной машины Azure (RM) с использованием ранее сделанного снимка в качестве диска ОС.

Вот что у меня есть.

data "azurerm_managed_disk" "windows-workstation_disk" {
  name = "workstation-disk"
  resource_group_name = "joeg"
}

## Workstation machine
resource "azurerm_virtual_machine" "windows-workstation" {
  name                  = "windows-workstation"
  location              = "${var.location}"
  resource_group_name   = "${azurerm_resource_group.rg.name}"
  vm_size               = "Standard_D2s_v3"
  network_interface_ids = ["${azurerm_network_interface.windows-workstation_nic.id}"]

  storage_os_disk {
  name              = "windows-workstation_osdisk"
  managed_disk_id   = "${data.azurerm_managed_disk.windows-workstation_disk.id}"
  create_option     = "Attach"
}

Я получаю следующую ошибку при запуске terraform apply

Error applying plan:

1 error(s) occurred:

* azurerm_virtual_machine.windows-workstation: Resource 
'data.azurerm_managed_disk.windows-workstation_disk' not found for variable 
'data.azurerm_managed_disk.windows-workstation_disk.id'

Есть идеи?

3 ответа

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

Я тестирую в своей лаборатории, у меня работает следующий tf файл.

resource "azurerm_resource_group" "test" {
  name = "shuicli"
  location = "East US"
}

resource "azurerm_managed_disk" "source" {
  name = "shuitest"
  location = "East US"
  resource_group_name = "shuicli"
  storage_account_type = "Standard_LRS"
  create_option = "Empty"
  disk_size_gb = "30"

  tags {
    environment = "staging"
  }
}

resource "azurerm_managed_disk" "copy" {
  name = "shuicli"
  location = "East US"
  resource_group_name = "shuicli"
  storage_account_type = "Standard_LRS"
  create_option = "Copy"
  source_resource_id = "<snapshot resource url>"
  disk_size_gb = "32"

  tags {
    environment = "staging"
  }
}

## Workstation machine
resource "azurerm_virtual_machine" "windows-workstation" {
  name                  = "windows-workstation"
  location              = "East US"
  resource_group_name   = "shuicli"
  vm_size               = "Standard_D2s_v3"
  network_interface_ids = ["${azurerm_network_interface.windows-workstation_nic.id}"]

  storage_os_disk {
  name              = "shuitest"
  os_type = "windows"
  managed_disk_id   = "${resource.azurerm_managed_disk.source.id}"
  create_option     = "Attach"
}

Чтобы использовать существующий моментальный снимок в Azure, сначала необходимо создать управляемый диск с идентификатором моментального снимка как source_resource_id:

      resource "azurerm_managed_disk" "some_name" {
  # option, copy and create a new disk from snapshot
  create_option = "Copy"
  # Snapshot ID
  source_resource_id = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/your_resource_group/providers/Microsoft.Compute/snapshots/my_snapshot"
  <other_parameters...>
}

Эти 2 статьи из "Andrade, Thiago" на Medium объяснят каждый этап этой задачи:

Я работал над той же проблемой и сумел создать виртуальную машину из снимка. Сначала создайте снимок виртуальной машины в рамках той же подписки. Затем в своем TF-файле проигнорируйте указанный выше исходный диск и просто создайте диск-копию с путем к моментальному снимку, указанному в "source_resource_id", и присоедините его к новой виртуальной машине в качестве диска ОС. Ниже приведен пример, который я использовал. Также убедитесь, что ссылка на диск в "storage_os_disk" - это "azurerm_managed_disk.copy.id", а не "resource.azurerm_managed_disk.copy.id". Надеюсь это поможет!

resource "azurerm_managed_disk" "copy" {
  name = "myOsDisk4"
  location = "North Europe"
  resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
  storage_account_type = "Standard_LRS"
  create_option = "Copy"
  source_resource_id = "/subscriptions/*************/resourceGroups/My-prod-rg/providers/Microsoft.Compute/snapshots/test-01-c-drive"
  disk_size_gb = "127"

  tags {
    environment = "Prod"
  }
}

# Create virtual machine
resource "azurerm_virtual_machine" "myterraformvm" {
    name                  = "Test-01"
    location              = "North Europe"
    resource_group_name   = "${azurerm_resource_group.myterraformgroup.name}"
    network_interface_ids = ["${azurerm_network_interface.myterraformnic.id}"]
    vm_size               = "Standard_DS1_v2"


    storage_os_disk {
    name              = "${azurerm_managed_disk.copy.name}"
    os_type           = "windows"
    managed_disk_id   = "${azurerm_managed_disk.copy.id}"
    create_option     = "Attach"
Другие вопросы по тегам