Bicep dosyasıyla Azure'da bir sanal makineyi yedekleme

Azure Backup , Azure portalı, PowerShell, CLI, Azure Resource Manager, Bicep gibi birden çok seçeneği kullanarak Azure VM'nizi yedeklemenize olanak tanır. Bu makalede, Azure Bicep dosyası ve Azure PowerShell ile Azure VM'sini yedekleme açıklanmaktadır. Bu hızlı başlangıçta, Bicep dosyasını dağıtarak bir Kurtarma Hizmetleri kasası oluşturma işlemine odaklanılır. Bicep dosyalarını geliştirme hakkında daha fazla bilgi için Bicep belgelerine ve şablon başvurusuna bakın.

Bicep, Azure kaynaklarını bildirimli olarak dağıtmaya yönelik bir dildir. Azure Resource Manager şablonlarınızı (ARM şablonları) geliştirmek için JSON yerine Bicep kullanabilirsiniz. Bicep söz dizimi karmaşıklığı azaltır ve geliştirme deneyimini geliştirir. Bicep, tüm JSON şablon özelliklerini sağlayan ARM şablonu JSON üzerinde saydam bir soyutlamadır. Dağıtım sırasında Bicep CLI, bicep dosyasını ARM şablonu JSON'a dönüştürür. Bicep dosyası, kaynak oluşturmak için bir dizi programlama komutu yazmadan Azure kaynaklarını ve kaynak özelliklerini belirtir.

ARM şablonunda geçerli olan kaynak türleri, API sürümleri ve özellikler de bicep dosyasında geçerlidir.

Önkoşullar

Bicep geliştirme ortamınızı ayarlamak için Bicep araçlarını yükleme konusuna bakın.

Uyarı

Makalede ayrıntılı olarak açıklandığı gibi en son Azure PowerShell modülünü ve Bicep CLI'yi yükleyin.

Şablonu gözden geçir

Aşağıda kullanılan şablon Azure hızlı başlangıç şablonlarından alınmıştı. Bu şablon, Koruma için DefaultPolicy ile yapılandırılmış basit Windows VM ve Kurtarma Hizmetleri kasası dağıtmanıza olanak tanır.

@description('Specifies a name for generating resource names.')
@maxLength(8)
param projectName string

@description('Specifies the location for all resources.')
param location string = resourceGroup().location

@description('Specifies the administrator username for the Virtual Machine.')
param adminUsername string

@description('Specifies the administrator password for the Virtual Machine.')
@secure()
param adminPassword string

@description('Specifies the unique DNS Name for the Public IP used to access the Virtual Machine.')
param dnsLabelPrefix string

@description('Virtual machine size.')
param vmSize string = 'Standard_A2'

@description('Specifies the Windows version for the VM. This will pick a fully patched image of this given Windows version.')
@allowed([
  '2008-R2-SP1'
  '2012-Datacenter'
  '2012-R2-Datacenter'
  '2016-Nano-Server'
  '2016-Datacenter-with-Containers'
  '2016-Datacenter'
  '2019-Datacenter'
  '2019-Datacenter-Core'
  '2019-Datacenter-Core-smalldisk'
  '2019-Datacenter-Core-with-Containers'
  '2019-Datacenter-Core-with-Containers-smalldisk'
  '2019-Datacenter-smalldisk'
  '2019-Datacenter-with-Containers'
  '2019-Datacenter-with-Containers-smalldisk'
])
param windowsOSVersion string = '2016-Datacenter'

var storageAccountName = '${projectName}store'
var networkInterfaceName = '${projectName}-nic'
var vNetAddressPrefix = '10.0.0.0/16'
var vNetSubnetName = 'default'
var vNetSubnetAddressPrefix = '10.0.0.0/24'
var publicIPAddressName = '${projectName}-ip'
var vmName = '${projectName}-vm'
var vNetName = '${projectName}-vnet'
var vaultName = '${projectName}-vault'
var backupFabric = 'Azure'
var backupPolicyName = 'DefaultPolicy'
var protectionContainer = 'iaasvmcontainer;iaasvmcontainerv2;${resourceGroup().name};${vmName}'
var protectedItem = 'vm;iaasvmcontainerv2;${resourceGroup().name};${vmName}'
var networkSecurityGroupName = 'default-NSG'

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
  properties: {}
}

resource publicIPAddress 'Microsoft.Network/publicIPAddresses@2020-06-01' = {
  name: publicIPAddressName
  location: location
  properties: {
    publicIPAllocationMethod: 'Dynamic'
    dnsSettings: {
      domainNameLabel: dnsLabelPrefix
    }
  }
}

resource networkSecurityGroup 'Microsoft.Network/networkSecurityGroups@2020-06-01' = {
  name: networkSecurityGroupName
  location: location
  properties: {
    securityRules: [
      {
        name: 'default-allow-3389'
        properties: {
          priority: 1000
          access: 'Allow'
          direction: 'Inbound'
          destinationPortRange: '3389'
          protocol: 'Tcp'
          sourceAddressPrefix: '*'
          sourcePortRange: '*'
          destinationAddressPrefix: '*'
        }
      }
    ]
  }
}

resource vNet 'Microsoft.Network/virtualNetworks@2020-06-01' = {
  name: vNetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        vNetAddressPrefix
      ]
    }
    subnets: [
      {
        name: vNetSubnetName
        properties: {
          addressPrefix: vNetSubnetAddressPrefix
          networkSecurityGroup: {
            id: networkSecurityGroup.id
          }
        }
      }
    ]
  }
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2020-06-01' = {
  name: networkInterfaceName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: publicIPAddress.id
          }
          subnet: {
            id: '${vNet.id}/subnets/${vNetSubnetName}'
          }
        }
      }
    ]
  }
}

resource virtualMachine 'Microsoft.Compute/virtualMachines@2020-06-01' = {
  name: vmName
  location: location
  properties: {
    hardwareProfile: {
      vmSize: vmSize
    }
    osProfile: {
      computerName: vmName
      adminUsername: adminUsername
      adminPassword: adminPassword
    }
    storageProfile: {
      imageReference: {
        publisher: 'MicrosoftWindowsServer'
        offer: 'WindowsServer'
        sku: windowsOSVersion
        version: 'latest'
      }
      osDisk: {
        createOption: 'FromImage'
      }
      dataDisks: [
        {
          diskSizeGB: 1023
          lun: 0
          createOption: 'Empty'
        }
      ]
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterface.id
        }
      ]
    }
    diagnosticsProfile: {
      bootDiagnostics: {
        enabled: true
        storageUri: storageAccount.properties.primaryEndpoints.blob
      }
    }
  }
}

resource recoveryServicesVault 'Microsoft.RecoveryServices/vaults@2020-02-02' = {
  name: vaultName
  location: location
  sku: {
    name: 'RS0'
    tier: 'Standard'
  }
  properties: {}
}

resource vaultName_backupFabric_protectionContainer_protectedItem 'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems@2020-02-02' = {
  name: '${vaultName}/${backupFabric}/${protectionContainer}/${protectedItem}'
  properties: {
    protectedItemType: 'Microsoft.Compute/virtualMachines'
    policyId: '${recoveryServicesVault.id}/backupPolicies/${backupPolicyName}'
    sourceResourceId: virtualMachine.id
  }
} 

Yukarıdaki şablonda tanımlanan kaynaklar şunlardır:

Şablonu dağıt

Şablonu dağıtmak için Deneyin'i seçerek Azure Cloud Shell'i açın ve ardından kabuk penceresine aşağıdaki PowerShell betiğini yapıştırın. Kodu yapıştırmak için kabuk penceresine sağ tıklayın ve yapıştır'ı seçin.

$projectName = Read-Host -Prompt "Enter a project name (limited to eight characters) that is used to generate Azure resource names"
$location = Read-Host -Prompt "Enter the location (for example, centralus)"
$adminUsername = Read-Host -Prompt "Enter the administrator username for the virtual machine"
$adminPassword = Read-Host -Prompt "Enter the administrator password for the virtual machine" -AsSecureString
$dnsPrefix = Read-Host -Prompt "Enter the unique DNS Name for the Public IP used to access the virtual machine"

$resourceGroupName = "${projectName}rg"
$templateUri = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.recoveryservices/recovery-services-create-vm-and-configure-backup/main.bicep"

New-AzResourceGroup -Name $resourceGroupName -Location $location
New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri $templateUri -projectName $projectName -adminUsername $adminUsername -adminPassword $adminPassword -dnsLabelPrefix $dnsPrefix 

Dağıtımı doğrulayın.

Bir yedekleme işi başlat.

Şablon bir VM oluşturur ve VM'de yedeklemeyi etkinleştirir. Şablonu dağıttığınızda bir yedekleme işi başlatmanız gerekir. Daha fazla bilgi için Yedekleme işi başlatma sayfasına bakın.

Yedekleme işini izleme

Yedekleme işini izlemek için bkz Yedekleme işini izleme.

Kaynakları temizle

  • ARTıK VM'yi yedeklemeniz gerekmiyorsa, vm'yi temizleyebilirsiniz.
  • VM'yi geri yüklemeyi denemek için temizleme işlemini atlayın.
  • Mevcut bir VM kullandıysanız, kaynak grubunu ve VM'yi korumak için son Remove-AzResourceGroup cmdlet'ini atlayabilirsiniz.

Şu adımları izleyin:

  1. Korumayı devre dışı bırakın, geri yükleme noktalarını ve kasayı kaldırın.

  2. Kaynak grubunu ve ilişkili VM kaynaklarını aşağıdaki gibi silin:

    Disable-AzRecoveryServicesBackupProtection -Item $item -RemoveRecoveryPoints
    $vault = Get-AzRecoveryServicesVault -Name "myRecoveryServicesVault"
    Remove-AzRecoveryServicesVault -Vault $vault
    Remove-AzResourceGroup -Name "myResourceGroup" 
    
    

Sonraki Adımlar

Bu hızlı başlangıçta bir Kurtarma Hizmetleri kasası oluşturdunuz, bir sanal makine için koruma özelliklerini etkinleştirdiniz ve ilk kurtarma noktasını oluşturdunuz.