💾

共有ディスクを持ったAzure VMのバックアップ

2023/04/06に公開

共有ディスクは Azure VM Backup でバックアップを取ることができず、バックアップを取るにはディスクスナップショットを取る必要があります。
その処理を簡単に実行できるような Powershell スクリプトを作成しました。

前提

  • Azure Automation で(定期)実行します
  • VMにアタッチされているデータディスクは共有ディスクのみ
  • OSディスクと共有ディスクのスナップショットを取るタイミングはズレます

スクリプト

powershell

$vmResourceGroup = 'shared-disk-rg'
$vmNames = @('vm01','vm02')
$snapshotResourceGroup = 'shared-disk-rg'

function createSnapshot{
  Param ($vm, $disk)
  Write-Output ("Create snapshot: " + $disk.Name)
  $snapshot =  New-AzSnapshotConfig `
    -SourceUri $disk.ManagedDisk.Id `
    -Location $vm.location `
    -CreateOption copy
  $snapshotName = $(Get-Date -UFormat %Y%m%d-%H%M) + "_snapshot_" + $disk.Name
  
  $result = New-AzSnapshot `
    -Snapshot $snapshot `
    -SnapshotName $snapshotName `
    -ResourceGroupName $snapshotResourceGroup
  if($result.ProvisioningState -ne 'Succeeded'){
    Write-Error ("Failed create snapshot: " + $disk.Name)
    exit 1
  }
  Write-Output ("Succeeded Create snapshot: " + $disk.Name)
}

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

foreach ($vmName in $vmNames){
  $vm = Get-AzVM `
    -ResourceGroupName $vmResourceGroup `
    -Name $vmName
  createSnapshot $vm $vm.StorageProfile.OsDisk
}

# Create shared disk snapshot
$vm = Get-AzVM `
-ResourceGroupName $vmResourceGroup `
-Name $vmNames[0]
foreach($datadisk in $vm.StorageProfile.DataDisks){
  createSnapshot $vm $datadisk
}

使い方

$vmResourceGroup 共有ディスクを持ったVMのリソースグループ名
$vmNames 共有ディスクを持ったVMの名前
$snapshotResourceGroup ディスクスナップショットを保存するリソースグループ名

を指定して、Azure AutomationのマネージドIDに適切な権限を割り当てて実行します。

Microsoft (有志)

Discussion