Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
こんにちは。Azure サポートチームの三國です。
今回は2018年4月にリリースされた、管理ディスクの交換(スワップ)機能を用いて
仮想マシンを元のネットワークにリストアする方法をご案内します。
本ブログはAzure PowerShell編です。ポータルでの手順は以下の投稿をご参照下さい。
https://blogs.technet.microsoft.com/jpaztech/2018/05/30/restore-vm-by-swap-manageddisk/
本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。
注意事項
- Azure PowerShell のバージョンは 6.1.0 にて検証を行っておりますが、バージョンによってパラメータが異なる可能性や実行頂けない可能性があります。
- ストレージアカウントにvhdが作成され、管理ディスクが新規で作成されます。
- リストアする仮想マシンの情報を記載したjsonファイルがPowerShell実行元のローカルにダウンロードされます。
- バックアップは別途取得頂く必要がございます。
- 仮想マシンの停止が発生します。
- 仮想マシンのリストアが行われますので、実行には長時間を要します。
- サンプルのスクリプトである為、責任は一切負いかねます。十分に検証いただいた上でご利用をお願いいたします。
はじめに
Azure Backupでの仮想マシンの復元には2つの選択肢があります。
- 特定の時点のバックアップ VM である VM を新しく作成する。
- ディスクを復元し、そのプロセスに含まれるテンプレートを使用して、復元された VM をカスタマイズするか、個別にファイルを回復する。
(参考) Azure Portal を使用して仮想マシンを復元する
/ja-jp/azure/backup/backup-azure-arm-restore-vms
しかし、可能であれば復元前の仮想マシンと同じネットワークにリストアしたいというニーズも強くあるかと存じます。
そこで、以下のような手順で実現する方法をご案内いたします。
1. 仮想マシンのディスクをVHDに復元する
2. VHDを管理ディスク化する
3. 復元後のディスクを復元前のディスクと交換する(仮想マシンの停止が伴います)
これは、2018年4月より管理ディスクでも可能になった機能を用いております。
(参考) Managed Virtual Machines で OS ディスク スワップの一般提供を開始
https://blogs.technet.microsoft.com/jpitpro/2018/05/11/os-disk-swap-managed-disks/
それでは、サンプルスクリプトおよび使用法をご案内します。
サンプルスクリプトの使用法
'変数の指定'における各変数をカスタマイズしてご利用ください。
過去7日間に取得したBackUpのうち最新のものをリストアする動作となります。
リストア先のストレージアカウントにおいて、自動で決められたコンテナ名、vhd名でvhdがリストアされますが、作成される管理ディスク名は指定する必要があります。スクリプトでは接頭辞を付ける動作としております。
(例: 'testdisk'というディスク名なら'res-testdisk'となります)
その他ご不明点等ございましたらコメント欄に記載ください。
サンプルスクリプト
##################################################################################################################
## 変数の指定
##################################################################################################################
# サブスクリプションID
$subscriptionId = 'xxxxx-xxxxx-xxxxx-xxxxx-xxxxx'
# 仮想マシンのリソースグループ名
$vmResourceGroupName = 'sample-RG'
# 仮想マシン名
$vmName = 'sample-VM'
# BackUpのvault名
$vaultName = 'sample-vault'
# ストレージアカウントのリソースグループ名
$storageAccountResourceGroupName = 'sample-RG'
# ストレージアカウント名
$storageAccountName = 'samplestorage'
# リストア用の管理ディスクの接頭辞
$prefix = 'res-'
##################################################################################################################
## ログイン、サブスクリプションの選択
##################################################################################################################
Login-AzureRmAccount
Select-AzureRmSubscription -SubscriptionId $subscriptionId
##################################################################################################################
## リストア・管理ディスク作成の準備
##################################################################################################################
# 過去7日間に取得したBackUpのうち最新のものをディスクにリストア
Get-AzureRmRecoveryServicesVault -Name $vaultName | Set-AzureRmRecoveryServicesVaultContext
$namedContainer = Get-AzureRmRecoveryServicesBackupContainer -ContainerType "AzureVM" -Status "Registered" `
-FriendlyName $vmName
$backupitem = Get-AzureRmRecoveryServicesBackupItem -Container $namedContainer -WorkloadType "AzureVM"
$startDate = (Get-Date).AddDays(-7)
$endDate = Get-Date
$rp = Get-AzureRmRecoveryServicesBackupRecoveryPoint -Item $backupitem -StartDate $startdate.ToUniversalTime() `
-EndDate $enddate.ToUniversalTime()
$restorejob = Restore-AzureRmRecoveryServicesBackupItem -RecoveryPoint $rp[0] -StorageAccountName $storageAccountName `
-StorageAccountResourceGroupName $storageAccountResourceGroupName
Wait-AzureRmRecoveryServicesBackupJob -Job $restorejob -Timeout 43200
# Config JsonのURI取得
$job = Get-AzureRmRecoveryServicesBackupJobDetails -JobId $restorejob.JobId
$jsonContainer = $job.Properties["Config Blob Container Name"]
$jsonBlob = $job.Properties["Config Blob Name"]
# Config Jsonのダウンロード
$ctx = (Get-AzureRmStorageAccount -ResourceGroupName $storageAccountResourceGroupName -Name $storageAccountName).Context
Get-AzureStorageBlobContent -Blob $jsonBlob `
-Container $jsonContainer `
-Destination .\ `
-Context $ctx
# Jsonのオブジェクト化
$jsonObj = (Get-Content .\$jsonBlob -Encoding Unicode -Raw).TrimEnd([char]0x00) |ConvertFrom-Json
# VMオブジェクトの取得
$vmObj = Get-AzureRmVM -ResourceGroupName $vmResourceGroupName -Name $vmName
##################################################################################################################
##OSディスクの作成
##################################################################################################################
# OSディスクの作業用オブジェクトの作成
$osDiskObj = $jsonObj.'properties.storageProfile'.osDisk
# 現在のOSディスク情報の取得
$currentOSdisk = Get-AzureRmDisk -ResourceGroupName $vmResourceGroupName -DiskName $vmObj.StorageProfile.OsDisk.Name
# 管理ディスクの作成(OSディスク)
$newOsDiskName = $prefix + $currentOSdisk.Name
$osDiskConfig = New-AzureRmDiskConfig -Location $vmObj.Location `
-AccountType $currentOSdisk.Sku.Name -CreateOption Import -OsType $vmObj.StorageProfile.OsDisk.OsType -SourceUri $osDiskObj.vhd.uri
$newOSdisk = New-AzureRmDisk -ResourceGroupName $vmResourceGroupName -DiskName $newOsDiskName -Disk $osDiskConfig
##################################################################################################################
##データディスクの作成
##################################################################################################################
# データディスクの作業用オブジェクトの作成
$dataDiskObj = $jsonObj.'properties.storageProfile'.dataDisks
$currentDataDiskObj = $vmObj.StorageProfile.DataDisks
$newDataDiskArray = @()
if ($dataDiskObj){
$dataDiskObj | foreach{
$lunNum = $_.Lun
# 現在のデータディスク情報の取得
$currentDataDiskName = ($currentDataDiskObj | Where-Object {$_.Lun -eq $lunNum}).Name
$currentDataDisk = Get-AzureRmDisk -ResourceGroupName $vmResourceGroupName -DiskName $currentDataDiskName
# 管理ディスクの作成(データディスク)
$newDataDiskName = $prefix + $currentDatadiskName
$dataDiskConfig = New-AzureRmDiskConfig -Location $vmObj.Location `
-AccountType $currentDatadisk.Sku.Name -CreateOption Import -SourceUri $_.vhd.uri
$newDataDisk = New-AzureRmDisk -ResourceGroupName $vmResourceGroupName -DiskName $newDataDiskName -Disk $dataDiskConfig
$newDataDiskArray = $newDataDiskArray + $newDataDisk
}
}
##################################################################################################################
##仮想マシンの停止
##################################################################################################################
# 仮想マシンを停止する
Stop-AzureRmVM -ResourceGroupName $vmResourceGroupName -Name $vmName -Force
##################################################################################################################
##OSディスクの差し替え
##################################################################################################################
# 最新状態のVMオブジェクトの取得
$vmObj = Get-AzureRmVM -ResourceGroupName $vmResourceGroupName -Name $vmName
# OSディスクの差し替え
Set-AzureRmVMOSDisk -VM $vmObj -ManagedDiskId $newOSdisk.Id -Name $newOSdisk.Name
# 仮想マシン情報の更新をする
Update-AzureRmVM -ResourceGroupName $vmResourceGroupName -VM $vmObj
##################################################################################################################
##データディスクの差し替え
##################################################################################################################
if ($dataDiskObj){
$dataDiskObj | foreach{
$lunNum = $_.Lun
# デタッチするデータディスク情報の取得
$currentDataDiskName = ($currentDataDiskObj | Where-Object {$_.Lun -eq $lunNum}).Name
# アタッチするデータディスクオブジェクトの取得
$sourceVhd = $_.vhd.uri
$newDataDiskObj = $newDataDiskArray | Where-Object {$_.CreationData.SourceUri -eq $sourceVhd}
# 既存のデータディスクのデタッチ
Remove-AzureRmVMDataDisk -VM $vmObj -DataDiskNames $currentDataDiskName
# 仮想マシン情報の更新をする
Update-AzureRmVM -ResourceGroupName $vmResourceGroupName -VM $vmObj
# 新規のデータディスクのアタッチ
Add-AzureRmVMDataDisk -VM $vmObj -CreateOption Attach -Lun $_.lun -ManagedDiskId $newDataDiskObj.Id
# 仮想マシン情報の更新をする
Update-AzureRmVM -ResourceGroupName $vmResourceGroupName -VM $vmObj
}
}
##################################################################################################################
##仮想マシンの起動
##################################################################################################################
# 仮想マシンを起動する
Start-AzureRmVM -Name $vmName -ResourceGroupName $vmResourceGroupName