Freigeben über


Sichern einer virtuellen Maschine in Azure mit einer Bicep-Vorlage

Mit Azure Backup können Sie Ihre Azure-VM mit mehreren Optionen sichern - z. B. über das Azure-Portal, PowerShell, CLI, Azure Resource Manager, Bicep und so weiter. Dieser Artikel beschreibt, wie eine Azure-VM mit einer Azure Bicep-Vorlage und Azure PowerShell gesichert werden kann. Dieser Schnellstart konzentriert sich auf den Prozess der Bereitstellung einer Bicep-Vorlage zur Erstellung eines Recovery Services-Depots. Weitere Informationen zur Entwicklung von Bicep-Vorlagen finden Sie in der Bicep-Dokumentation und in der Vorlagenreferenz.

Bicep ist eine Sprache für die deklarative Bereitstellung von Azure-Ressourcen. Sie können Bicep anstelle von JSON verwenden, um Azure Resource Manager-Vorlagen (ARM-Vorlagen) zu erstellen. Die Bicep-Syntax reduziert die Komplexität und verbessert die Entwicklungserfahrung. Bicep ist eine transparente Abstraktion über die ARM-Vorlage JSON, die alle JSON-Vorlagenfunktionen bietet. Während der Bereitstellung konvertiert die Bicep CLI eine Bicep-Datei in eine ARM-Vorlage JSON. In einer Bicep-Datei werden die Azure-Ressourcen und Ressourceneigenschaften angegeben, ohne dass eine Folge von Programmierbefehlen zur Erstellung von Ressourcen geschrieben werden muss.

Ressourcentypen, API-Versionen und Eigenschaften, die in einer ARM-Vorlage gültig sind, sind auch in einer Bicep-Datei gültig.

Voraussetzungen

Informationen zum Einrichten Ihrer Umgebung für die Bicep-Entwicklung finden Sie unter Installieren von Bicep-Tools.

Hinweis

Installieren Sie das neueste Azure PowerShell-Modul und die Bicep CLI wie im Artikel beschrieben.

Überprüfen der Vorlage

Die unten verwendete Vorlage stammt aus Azure Schnellstartvorlagen. Mit dieser Vorlage können Sie einen einfachen Windows VM- und Recovery Services-Datenspeicher bereitstellen, der mit DefaultPolicy für Protection konfiguriert ist.

@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
  }
} 

Die in der obigen Vorlage definierten Ressourcen sind:

Bereitstellen der Vorlage

Um die Vorlage bereitzustellen, wählen Sie Versuchen, um die Azure Cloud Shell zu öffnen, und fügen Sie dann das folgende PowerShell-Skript in das Shell-Fenster ein. Klicken Sie zum Einfügen des Codes mit der rechten Maustaste auf das Shell-Fenster, und wählen Sie Einfügen aus.

$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 

Überprüfen der Bereitstellung

Starten eines Sicherungsauftrags

Die Vorlage erstellt eine VM und aktiviert die Sicherung auf der VM. Nachdem Sie die Vorlage bereitgestellt haben, müssen Sie einen Sicherungsauftrag starten. Weitere Informationen finden Sie unter Starten eines Sicherungsauftrags.

Überwachen des Sicherungsauftrags

Informationen zum Überwachen des Sicherungsauftrags finden Sie unter Überwachen des Sicherungsauftrags.

Bereinigen von Ressourcen

  • Wenn der virtuelle Computer nicht mehr gesichert werden muss, können Sie ihn bereinigen.
  • Um die Wiederherstellung der VM zu testen, überspringen Sie den Bereinigungsprozess.
  • Wenn Sie eine vorhandene VM verwendet haben, können Sie das abschließende Cmdlet Remove-AzResourceGroup überspringen, um die Ressourcengruppe und VM zu behalten.

Führen Sie die folgenden Schritte aus:

  1. Deaktivieren Sie den Schutz, und entfernen Sie die Wiederherstellungspunkte und den Tresor.

  2. Löschen Sie die Ressourcengruppe und die zugehörigen VM-Ressourcen wie folgt:

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

Nächste Schritte

In dieser Schnellstartanleitung haben Sie einen Recovery Services-Tresor erstellt, den Schutz für einen virtuellen Computer aktiviert und den ersten Wiederherstellungspunkt erstellt.