Прочитать на английском

Поделиться через


Резервное копирование виртуальной машины в Azure с помощью шаблона Bicep

Azure Backup позволяет создавать резервные копии виртуальных машин Azure с помощью разных вариантов: портал Azure, PowerShell, CLI, Azure Resource Manager, Bicep и т. д. В этой статье описывается, как создать резервную копию виртуальной машины Azure с помощью шаблона Azure Bicep и Azure PowerShell. В данном кратком руководстве рассматривается преимущественно процесс развертывания шаблона Bicep для создания хранилища Служб восстановления. Дополнительные сведения о разработке шаблонов Bicep см. в разделе Документация по Bicep и в справочнике по шаблонам.

Bicep — это язык для декларативного развертывания ресурсов Azure. Bicep можно использовать вместо JSON для разработки шаблонов Azure Resource Manager (шаблонов ARM). Синтаксис Bicep является более простым и улучшает процесс разработки. Bicep — это прозрачная абстракция кода JSON шаблонов ARM, обеспечивающая все возможности этих шаблонов. Во время развертывания Bicep CLI преобразует файл Bicep в шаблон ARM в формате JSON. В файле Bicep ресурсы и свойства ресурсов Azure просто объявляются, без написания последовательности команд для создания ресурсов.

Типы ресурсов, версии API и свойства, допустимые в шаблоне ARM, также допустимы и в файле Bicep.

Необходимые компоненты

Сведения о настройке среды для разработки Bicep см. в разделе Установка средств Bicep.

Примечание

Установите последнюю версию модуля Azure PowerShell и Bicep CLI, как описано в статье.

Изучение шаблона

Шаблон, используемый ниже, взят из шаблонов быстрого запуска Azure. Этот шаблон позволяет развернуть простую виртуальную машину Windows и хранилище Служб восстановления с конфигурацией DefaultPolicy, имеющей значение Protection (Защита).

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

В шаблоне определены следующие ресурсы:

Развертывание шаблона

Для развертывания шаблона щелкните Попробовать, чтобы открыть Azure Cloud Shell, а затем вставьте следующий скрипт PowerShell в окно оболочки. Чтобы вставить код, щелкните окно оболочки правой кнопкой мыши, а затем выберите Вставить.

Azure PowerShell
$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 

Проверка развертывания

Запуск задания резервного копирования

Шаблон создает виртуальную машину и включает на ней резервное копирование. После развертывания шаблона необходимо запустить задание резервного копирования. Дополнительные сведения см. в разделе Запуск задания резервного копирования.

Мониторинг задания резервного копирования

Мониторинг задания резервного копирования описывается в разделе Мониторинг задания резервного копирования.

Очистка ресурсов

  • Если вам больше не требуется резервная копия виртуальной машины, ее можно удалить.
  • Чтобы попытаться восстановить виртуальною машину, пропустите удаление.
  • Если вы использовали имеющуюся виртуальную машину, можете пропустить последний командлет Remove-AzResourceGroup, чтобы оставить группу ресурсов и виртуальную машину.

Выполните следующие действия:

  1. Отключите защиту, удалите точки восстановления и хранилище.

  2. Удалите группу ресурсов и связанные ресурсы виртуальной машины следующим образом:

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

Следующие шаги

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