Azure VM data disk replication is failing using terraform

127 Views Asked by At

I'm trying to replicate Azure Windows VM, the OS disk is replicating properly but unable to replicate the data disk using Terraform script, getting the same error after trying multiple times.

All the values are correct facing an issue with data disk replication only:

│ Error: updating replicated vm vm-replication (vault example-recovery-vault): polling after Update: polling failed: the Azure API returned the following error:
│
│ Status: “150153”
│ Code: “”
│ Message: “Could not update the properties of the virtual machine ‘example-machine’ because of following invalid disk Ids: ‘/subscriptions/******************************

My code is the following:

managed_disk {

disk_id = “/subscriptions/******************************"

staging_storage_account_id = azurerm_storage_account.primary.id

target_resource_group_id = azurerm_resource_group.secondary.id

target_disk_type = “Premium_LRS”

target_replica_disk_type = “Premium_LRS”

}
1

There are 1 best solutions below

0
Venkat V On

Azure VM data disk replication is failing using terraform

Here is the updated Terraform code to replicate the both OS and Data disk of the VM.

    provider "azurerm" {
      features {}
    }
    resource "azurerm_resource_group" "primary" {
      name     = "tfex-replicated-vm-primary"
      location = "West US"
    }
    
    resource "azurerm_resource_group" "secondary" {
      name     = "tfex-replicated-vm-secondary"
      location = "East US"
    }
    
    
    resource "azurerm_managed_disk" "data_disk" {
      name                 = "data-disk"
      location             = azurerm_resource_group.primary.location
      resource_group_name  = azurerm_resource_group.primary.name
      storage_account_type = "Premium_LRS"
      create_option        = "Empty"
      disk_size_gb         = 128  
    }
    
    
    resource "azurerm_virtual_machine" "vm" {
      name                  = "vm"
      location              = azurerm_resource_group.primary.location
      resource_group_name   = azurerm_resource_group.primary.name
      vm_size               = "Standard_B1s"
      network_interface_ids = [azurerm_network_interface.vm.id]
    
      storage_image_reference {
        publisher = "Canonical"
        offer     = "0001-com-ubuntu-server-jammy"
        sku       = "22_04-lts"
        version   = "latest"
      }
    
      storage_os_disk {
        name              = "vm-os-disk"
        os_type           = "Linux"
        caching           = "ReadWrite"
        create_option     = "FromImage"
        managed_disk_type = "Premium_LRS"
      }
    
      os_profile {
        admin_username = "test-admin-123"
        admin_password = "test-pwd-123"
        computer_name  = "vm"
      }
    
      os_profile_linux_config {
        disable_password_authentication = false
      }
    
      storage_data_disk {
        name            = azurerm_managed_disk.data_disk.name
        managed_disk_id = azurerm_managed_disk.data_disk.id
        caching         = "ReadWrite"
        create_option   = "Attach"  
        lun             = 0         
        disk_size_gb    = azurerm_managed_disk.data_disk.disk_size_gb  
      }
    }
    
    
    resource "azurerm_recovery_services_vault" "vault" {
      name                = "example-recovery-vault"
      location            = azurerm_resource_group.secondary.location
      resource_group_name = azurerm_resource_group.secondary.name
      sku                 = "Standard"
    }
    
    resource "azurerm_site_recovery_fabric" "primary" {
      name                = "primary-fabric"
      resource_group_name = azurerm_resource_group.secondary.name
      recovery_vault_name = azurerm_recovery_services_vault.vault.name
      location            = azurerm_resource_group.primary.location
    }
    
    resource "azurerm_site_recovery_fabric" "secondary" {
      name                = "secondary-fabric"
      resource_group_name = azurerm_resource_group.secondary.name
      recovery_vault_name = azurerm_recovery_services_vault.vault.name
      location            = azurerm_resource_group.secondary.location
    }
    
    resource "azurerm_site_recovery_protection_container" "primary" {
      name                 = "primary-protection-container"
      resource_group_name  = azurerm_resource_group.secondary.name
      recovery_vault_name  = azurerm_recovery_services_vault.vault.name
      recovery_fabric_name = azurerm_site_recovery_fabric.primary.name
    }
    
    resource "azurerm_site_recovery_protection_container" "secondary" {
      name                 = "secondary-protection-container"
      resource_group_name  = azurerm_resource_group.secondary.name
      recovery_vault_name  = azurerm_recovery_services_vault.vault.name
      recovery_fabric_name = azurerm_site_recovery_fabric.secondary.name
    }
    
    resource "azurerm_site_recovery_replication_policy" "policy" {
      name                                                 = "policy"
      resource_group_name                                  = azurerm_resource_group.secondary.name
      recovery_vault_name                                  = azurerm_recovery_services_vault.vault.name
      recovery_point_retention_in_minutes                  = 24 * 60
      application_consistent_snapshot_frequency_in_minutes = 4 * 60
    }
    
    resource "azurerm_site_recovery_protection_container_mapping" "container-mapping" {
      name                                      = "container-mapping"
      resource_group_name                       = azurerm_resource_group.secondary.name
      recovery_vault_name                       = azurerm_recovery_services_vault.vault.name
      recovery_fabric_name                      = azurerm_site_recovery_fabric.primary.name
      recovery_source_protection_container_name = azurerm_site_recovery_protection_container.primary.name
      recovery_target_protection_container_id   = azurerm_site_recovery_protection_container.secondary.id
      recovery_replication_policy_id            = azurerm_site_recovery_replication_policy.policy.id
    }
    
    resource "azurerm_site_recovery_network_mapping" "network-mapping" {
      name                        = "network-mapping"
      resource_group_name         = azurerm_resource_group.secondary.name
      recovery_vault_name         = azurerm_recovery_services_vault.vault.name
      source_recovery_fabric_name = azurerm_site_recovery_fabric.primary.name
      target_recovery_fabric_name = azurerm_site_recovery_fabric.secondary.name
      source_network_id           = azurerm_virtual_network.primary.id
      target_network_id           = azurerm_virtual_network.secondary.id
    }
    
    resource "azurerm_storage_account" "primary" {
      name                     = "primaryr"
      location                 = azurerm_resource_group.primary.location
      resource_group_name      = azurerm_resource_group.primary.name
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    
    resource "azurerm_storage_account" "secondary" {
      name                     = "secondarystorages"
      location                 = azurerm_resource_group.secondary.location
      resource_group_name      = azurerm_resource_group.secondary.name
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    
    resource "azurerm_virtual_network" "primary" {
      name                = "network1"
      resource_group_name = azurerm_resource_group.primary.name
      address_space       = ["192.168.1.0/24"]
      location            = azurerm_resource_group.primary.location
    }
    
    resource "azurerm_virtual_network" "secondary" {
      name                = "network2"
      resource_group_name = azurerm_resource_group.secondary.name
      address_space       = ["192.168.2.0/24"]
      location            = azurerm_resource_group.secondary.location
    }
    
    resource "azurerm_subnet" "primary" {
      name                 = "network1-subnet"
      resource_group_name  = azurerm_resource_group.primary.name
      virtual_network_name = azurerm_virtual_network.primary.name
      address_prefixes     = ["192.168.1.0/24"]
    }
    
    resource "azurerm_subnet" "secondary" {
      name                 = "network2-subnet"
      resource_group_name  = azurerm_resource_group.secondary.name
      virtual_network_name = azurerm_virtual_network.secondary.name
      address_prefixes     = ["192.168.2.0/24"]
    }
    
    resource "azurerm_public_ip" "primary" {
      name                = "vm-public-ip-primary"
      allocation_method   = "Static"
      location            = azurerm_resource_group.primary.location
      resource_group_name = azurerm_resource_group.primary.name
      sku                 = "Basic"
    }
    
    resource "azurerm_public_ip" "secondary" {
      name                = "vm-public-ip-secondary"
      allocation_method   = "Static"
      location            = azurerm_resource_group.secondary.location
      resource_group_name = azurerm_resource_group.secondary.name
      sku                 = "Basic"
    }
    
    resource "azurerm_network_interface" "vm" {
      name                = "vm-nic"
      location            = azurerm_resource_group.primary.location
      resource_group_name = azurerm_resource_group.primary.name
    
      ip_configuration {
        name                          = "vm"
        subnet_id                     = azurerm_subnet.primary.id
        private_ip_address_allocation = "Dynamic"
        public_ip_address_id          = azurerm_public_ip.primary.id
      }
    }
    
    resource "azurerm_site_recovery_replicated_vm" "vm-replication" {
      name                                      = "vm-replication"
      resource_group_name                       = azurerm_resource_group.secondary.name
      recovery_vault_name                       = azurerm_recovery_services_vault.vault.name
      source_recovery_fabric_name               = azurerm_site_recovery_fabric.primary.name
      source_vm_id                              = azurerm_virtual_machine.vm.id
      recovery_replication_policy_id            = azurerm_site_recovery_replication_policy.policy.id
      source_recovery_protection_container_name = azurerm_site_recovery_protection_container.primary.name
    
      target_resource_group_id                = azurerm_resource_group.secondary.id
      target_recovery_fabric_id               = azurerm_site_recovery_fabric.secondary.id
      target_recovery_protection_container_id = azurerm_site_recovery_protection_container.secondary.id
    
      managed_disk {
        disk_id                    = azurerm_virtual_machine.vm.storage_os_disk[0].managed_disk_id
        staging_storage_account_id = azurerm_storage_account.primary.id
        target_resource_group_id   = azurerm_resource_group.secondary.id
        target_disk_type           = "Premium_LRS"
        target_replica_disk_type   = "Premium_LRS"
      }
      
      managed_disk {
        disk_id                    = azurerm_managed_disk.data_disk.id
        staging_storage_account_id = azurerm_storage_account.primary.id
        target_resource_group_id   = azurerm_resource_group.secondary.id
        target_disk_type           = "Premium_LRS"
        target_replica_disk_type   = "Premium_LRS"
      }
    
      network_interface {
        source_network_interface_id   = azurerm_network_interface.vm.id
        target_subnet_name            = azurerm_subnet.secondary.name
        recovery_public_ip_address_id = azurerm_public_ip.secondary.id
      }
    
      depends_on = [
        azurerm_site_recovery_protection_container_mapping.container-mapping,
        azurerm_site_recovery_network_mapping.network-mapping,
      ]
    }

The terraform code created a VM with a data disk and attached it to the VM.

enter image description here

After running the terraform code, both OS and data disk has been replicated successfully.

Terraform apply:

enter image description here

Reference: azurerm_site_recovery_replicated_vm