Azure」カテゴリーアーカイブ

可用性セットを考慮したAzure仮想マシンのリストア

Azure ポータルからの操作では可用性セットの中に仮想マシンをリストアできないので、PowerShellで実行する。

まず、Azure PowerShellの環境を整えておく(参考)。

さらに、リソースグループ/仮想マシン/Recovery Services vault/ストレージアカウントの名前を事前にAzureポータルで調べておく。この例では、以下のようなリソース名になっている。

  • リソースグループ:Test01_RG
  • 仮想ネットワーク名:Test01_VNET
  • Recovery Services vault:Test01-Backup
  • 元の仮想マシン名:web1
  • 復元先仮想マシン名:restoretest1
  • ストレージアカウント名:test01st
  • リージョン:東日本

1. コンテキストをRecovery Services vaultに設定する

Get-AzureRmRecoveryServicesVault -Name "Test01-Backup" | Set-AzureRmRecoveryServicesVaultContext

2. 仮想マシンを選択

FriendlyNameオプションの引数に、復元したい仮想マシンの名前を入れる。

$namedContainer = Get-AzureRmRecoveryServicesBackupContainer -ContainerType "AzureVM" -Status "Registered" -FriendlyName "web1"
$backupItem = Get-AzureRmRecoveryServicesBackupItem -Container $namedContainer -WorkloadType "AzureVM"

3. 対象とする復元ポイントを探す

最近1週間のバックアップオブジェクトを配列rpに入れる。

$startDate = (Get-Date).AddDays(-7)
$endDate = Get-Date
$rp = Get-AzureRmRecoveryServicesBackupRecoveryPoint -Item $backupItem -StartDate $startDate.ToUniversalTime() -EndDate $endDate.ToUniversalTime()
$rp[0]

最終行、$rp[0]の実行で、一番最近の復元ポイントが表示される。これ以外を選びたい場合は$rp[1]などを順次表示して、日付と時刻(UTC)で判断して選ぶ。

4. 復元ポイントを選択して、ディスクを復元する

$rp[0]の復元ポイントの仮想ディスクを戻す。

$restorejob = Restore-AzureRmRecoveryServicesBackupItem -RecoveryPoint $rp[0] -StorageAccountName "test01st" -StorageAccountResourceGroupName "Test01_RG"
Wait-AzureRmRecoveryServicesBackupJob -Job $restorejob -Timeout 43200

1行目で復元ジョブを実行できるが、ジョブ完了前にプロンプトに戻ってしまうので、2行目のWait-AzureRmRecoveryServicesBackupJobを実行して完了を待つ。

5. 復元ジョブの情報を元にJSONファイルを作成する

$destination_pathには、JSONファイルのフルパスを記述する。コマンドを実行するユーザで書き込めるフォルダを指定すること。

$restorejob = Get-AzureRmRecoveryServicesBackupJob -Job $restorejob
$details = Get-AzureRmRecoveryServicesBackupJobDetails -Job $restorejob
$properties = $details.properties
$storageAccountName = $properties["Target Storage Account Name"]
$containerName = $properties["Config Blob Container Name"]
$blobName = $properties["Config Blob Name"]
Set-AzureRmCurrentStorageAccount -Name $storageAccountName -ResourceGroupName "Test01_RG"
$destination_path = "C:\Users\test\Desktop\vmconfig.json"
Get-AzureStorageBlobContent -Container $containerName -Blob $blobName -Destination $destination_path

6. 復元する仮想マシンの設定をJSONファイルから読み込む

VMNameオプションで復元先仮想マシンの名前を指定する。元の仮想マシンと同じにすることはできない。

$obj = ((Get-Content -Path $destination_path -Raw -Encoding Unicode)).TrimEnd([char]0x00) | ConvertFrom-Json
$availabilitySet = Get-AzureRmAvailabilitySet -ResourceGroupName "Test01_RG" -Name "test_availability_set"
$vm = New-AzureRmVMConfig -VMSize $obj.'properties.hardwareProfile'.vmSize -VMName "restoretest1" -AvailabilitySetId $availabilitySet.Id

7. ディスクの設定を追加する

下記の例ではOSディスクがrt1-osdiskという名前に、データディスクがrt1-datadisk1, rt1-datadisk2,…という名前になる。

Set-AzureRmVMOSDisk -VM $vm -Name "rt1-osdisk" -VhdUri $obj.'properties.storageProfile'.osDisk.vhd.Uri -CreateOption "Attach"
$vm.storageProfile.OsDisk.OsType = $obj.'properties.storageProfile'.OsDisk.OsType
foreach($dd in $obj.'properties.storageProfile'.DataDisks)
{
  $dataDiskName = "rt1-datadisk" + $dd.lun
  $vm = Add-AzureRmVMDataDisk -VM $vm -Name $dataDiskName -VhdUri $dd.vhd.Uri -Lun $dd.lun -CreateOption "Attach"
}

8. NICの設定を追加する

$nicName = "rt1-nic"
$pip = New-AzureRmPublicIpAddress -Name $nicName -ResourceGroupName "Test01_RG" -Location "japaneast" -AllocationMethod Dynamic
$vnet = Get-AzureRmVirtualNetwork -Name "Test01_VNET" -ResourceGroupName "Test01_RG"
$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName "Test01_RG" -Location "japaneast" -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id

9. 仮想マシン復元を実行する

New-AzureRmVM -ResourceGroupName "Test01_RG" -Location "japaneast" -VM $vm

10. 後処理

あとはポータルで実施する。
・復元した仮想マシンのNICに、ネットワークセキュリティグループを追加
・復元した仮想マシンのNICに、元々のパブリックIPアドレスを付け替える
・復元した仮想マシンを、ロードバランサーのバックエンドプールに追加する

参考URL:
Azureでスナップショットの取得について(Azure Backup サービス)
AzureRM.RecoveryServices.Backup コマンドレットを使って仮想マシンをバックアップする
AzureBackupから可用性セットへリストアするPowerShellスクリプト

Azure PowerShellの準備

環境:Windows10 Pro 1703 64bitで確認。

まずローカルWindowsで管理者権限のPowerShellウインドウを開き、AzureRMモジュールをインストールする。

PS C:\WINDOWS\system32> Install-Module AzureRM

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを
信頼する場合は、Set-PSRepository コマンドレットを実行して、リポジトリの InstallationPolicy 
の値を変更してください。'PSGallery' からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y
(Enterを押す)

あとは自動的にモジュールがインストールされる。

次に管理者権限PowerShellを閉じ、一般権限のPowerShellを開く。

Microsoftアカウントでログインする。

PS C:\Users\username> Login-AzureRmAccount

ポップアップウインドウが表示されるので、そこにユーザ名とパスワードを入力する。

これで準備完了なので、以下やりたいことを実行する。

参考URL:
Azure PowerShell のインストールおよび構成
Azure PowerShell と Resource Manager でリソースを管理する