💾
共有ディスクを持ったAzure VMのバックアップ
共有ディスクは 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に適切な権限を割り当てて実行します。
Discussion