🦔

Azure PowerShellを使って、VM単体もしくはRSV単位でVMのバックアップを手動実行する。

2023/04/06に公開

概要

Azure BackupでVMをバックアップしていて毎日バックアップを取得しています。
でもそれとは別に、Windows Updateの前とか、月1回とか、システムアップデート直前に、手動でバックアップ取得したいと思いました。
でもAzure Portal上でまとめてバックアップとか、Azure PowerShellでバックアップ実行しているブログを探したりしましたが、見当たらなかったので作りました。
もう少し言うと、Azure PowerShellでVM単体をバックアップしているのはありましたが、まとめてというのが見つからなかったです。

VMが増えるたびにスクリプトにそのVMを追加していけばいいですが、そもそもそれが面倒なので、どうにかループさせることが出来ないかなと思いました。
これをAutomationアカウントのRunbookに公開して、スケジュール登録とかをすれば、夜間にバックアップ取得することもしなくて済みます。

Azure Backupの設定やAutomationアカウント、Azure PowerShellの使い方みたいなのは割愛します。

コンセプト

環境に合わせて変数定義のところだけ書き換え、ジョブ設定やバックアップ実行内は一切変更しなくて済むようにしました。
Recovery Servicesコンテナー(RSV)単位のスクリプトなので、複数のRSVが存在しているならスクリプトを複製してください。

対象

RSVにバックアップデータが存在しているVMが対象。
一度もバックアップしてなかったり、バックアップ停止していてバックアップデータが消えているVMはバックアップ取得されないと思われる(未確認)。

条件

Azure PowerShellが実行PCにインストールされていること。
もしくはCloudShellやAutomationアカウントのPowerShellのRunbookを使う。

バックアップ手動実行(VM単体)

VM単体をバックアップしたい場合もあると思うので、そのスクリプトです。
これはMS公式や参考ブログの内容のほとんどそのままです。

変数定義の値を自分の環境に合わせて変更するだけで動きます。
以下の例だと、rsv01に保存されているVM01のバックアップを実行し、60日保管するというスクリプトです。

# Azureログイン(これはRunbook用のため、ローカルPCやCloudShellから実行する場合はスキップする)
try
{
    "Logging in to Azure..."
    Connect-AzAccount -Identity
}
catch {
    Write-Error -Message $_.Exception
    throw $_.Exception
}

# Azureログイン(これはローカルPC用のため、loudShellやRunbookから実行する場合はスキップする)
Connect-AzAccount

# 変数定義
$RSVRGName = "rg01"
$RSVName = "rsv01"
$VMName = "VM01"
$ContainerType = "AzureVM"
$Date = "60"

# ジョブ設定
$Vault = Get-AzRecoveryServicesVault -ResourceGroupName $RSVRGName -Name $RSVName
$NamedContainer = Get-AzRecoveryServicesBackupContainer -ContainerType $ContainerType -FriendlyName $VMName -VaultId $Vault.ID
$Item = Get-AzRecoveryServicesBackupItem -Container $namedContainer -WorkloadType $ContainerType -VaultId $targetVault.ID
$EndDate = (Get-Date).AddDays($Date).ToUniversalTime()
Write-Output ("RecoveryPoints will be retained till " + ([DateTime]$EndDate).ToString("yyyy/MM/dd"))

# バックアップ実行
$Job = Backup-AzRecoveryServicesBackupItem -Item $Item -VaultId $Vault.ID -ExpiryDateTimeUTC $EndDate

バックアップ手動実行(RSV全体)

RSVでバックアップしてる全VMを一気にバックアップする。
VMが増えるごとに単体のコマンドを作るのは面倒なので、ループするようにしてメンテナンス不要です。

さすがにRSVが増えるごとに同じものを作らないといけないが、コピーして変数だけ変えればいいので簡単。

変数定義の値を自分の環境に合わせて変更するだけで動きます。
以下の例だと、rsv01に保存されている全VMのバックアップを実行し、60日保管するというスクリプトです。
仮にVMが増えてもこのスクリプトを変更する必要はありません。

(VM単体パターンより変数名はちょっと変えました。)

# Azureログイン(これはRunbook用のため、ローカルPCやCloudShellから実行する場合はスキップする)
try
{
    "Logging in to Azure..."
    Connect-AzAccount -Identity
}
catch {
    Write-Error -Message $_.Exception
    throw $_.Exception
}

# Azureログイン(これはローカルPC用のため、loudShellやRunbookから実行する場合はスキップする)
Connect-AzAccount

# 変数定義
$RSVRGName = "rg01"
$RSVName = "rsv01"
$ContainerType = "AzureVM"
$Date = "60"

# ジョブ設定
$RSV = Get-AzRecoveryServicesVault -ResourceGroupName $RSVRGName -Name $RSVName
$BackupVMList = Get-AzRecoveryServicesBackupContainer -ContainerType $ContainerType -VaultId $RSV.ID
$EndDate = (Get-Date).AddDays($Date).ToUniversalTime()
Write-Output ("RecoveryPoints will be retained till " + ([DateTime]$EndDate).ToString("yyyy/MM/dd"))
Write-Output ("The number of VMs to be backed up is " + $BackupVMList.Count)

# バックアップ実行
ForEach ($VMName in $BackupVMList) {
Write-Output ("Working on VM backup: " + $VMName.FriendlyName)
$BackupRSV = Get-AzRecoveryServicesBackupContainer -ContainerType $ContainerType -FriendlyName $VMName.FriendlyName -VaultId $RSV.ID
$Item = Get-AzRecoveryServicesBackupItem -Container $BackupRSV -WorkloadType $ContainerType -VaultId $RSV.ID
$Job = Backup-AzRecoveryServicesBackupItem -Item $Item -VaultId $RSV.ID -ExpiryDateTimeUTC $EndDate
Write-Output ($Job)
}

AutomationアカウントのRunbookで動かす場合

対象のAutomationアカウントのマネージドIDにRBACを付与する必要がある。
なのでバックアップオペレーターロールを、対象のRSVに付与する。
継承させたいならサブスクリプションかリソースグループに付与しておく。

参考

https://learn.microsoft.com/en-us/azure/backup/backup-azure-vms-automation
https://learn.microsoft.com/en-us/powershell/module/az.recoveryservices/backup-azrecoveryservicesbackupitem?view=azps-9.4.0
https://qiita.com/y447093040/items/1774d8ef5a9e71d837c4
https://charbelnemnom.com/automate-backup-for-azure-vms-using-powershell-for-azure-backup/

Discussion