Azure Automationを使用してAzure Backupを1日に複数回自動実行する①

#背景
　Azure 標準機能を用いて、Azure仮想マシン等のバックアップを取得する場合、基本的にはAzure Backupを使用することになります。ここで注意すべき点として、Azure Backupのスケジュール設定ではバックアップの取得頻度は最短でも1日であることです。つまり1日に複数回バックアップを取得するようにスケジュールすることはAzure Backupの仕様上不可能です。

　以下のように、バックアップスケジュールを設定する箇所において、バックアップ実行時刻を複数選択することはできません。

![cap01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531201/df4f3700-1a38-e3b9-f2d6-fe0a4f969d05.png)


　それでも何とかより短い頻度でバックアップを取得することは出来ないかと検討した結果、Azure Automationを組み合わせることに至りました。本記事ではその方法についてご紹介します。
※ Azure BackupやAzure Automationの基本的な使用方法は割愛しております。

#方針
　まずは、実現方針について簡単に説明します。Azure Backupではスケジュール設定による自動バックアップとは別に任意のタイミングで手動バックアップを実行することが出来ます。そこで、手動バックアップを実行するPowerShellコマンドをAzure Automationを用いて定期実行することで1日に複数回のバックアップを自動実行することが出来るのではないかと考えました。また前提として、今回のバックアップ対象はAzure仮想マシンとします。

#事前準備
　以下のAzureリソースを事前に作成する必要が有ります。
・Revocery Services コンテナー
・バックアップ対象仮想マシン
・Azure Automation Account

　バックアップ対象仮想マシンについては、Recovery Services コンテナーにてバックアップスケジュールを関連付け、自動バックアップが取得される状態である必要が有ります。

#実行コマンド
　続いて、Azure Automationにて実行するPowerShellコマンドを以下に記載します。Azure PowerShellのModuleについては、AzureRMとAzそれぞれの場合について記載します。まずはAzureRMモジュールの場合です。(実行コマンドについては、[こちら](https://docs.microsoft.com/ja-jp/azure/backup/backup-azure-vms-automation)を参照)

```
##変数の指定
$vaultName = "<Recovery Services コンテナー名>"
$rgName = "<Recovery Services コンテナーが存在するリソースグループ名>"
$vmName = "<バックアップ対象の仮想マシン名>"
$date = <バックアップ保存日数>

## Recovery Services コンテナーの指定
$targetVault = Get-AzureRmRecoveryServicesVault -Name $vaultName -ResourceGroupName $rgName | Set-AzureRmRecoveryServicesVaultContext

## バックアップ対象の指定
$namedContainer = Get-AzureRmRecoveryServicesBackupContainer -ContainerType "AzureVM" -Status "Registered" -FriendlyName $vmName  
$item = Get-AzureRmRecoveryServicesBackupItem -Container $namedContainer -WorkloadType "AzureVM"

##バックアップデータの保存期間を指定
$endDate = (Get-Date).AddDays($date).ToUniversalTime()

##バックアップジョブの実行
$job = Backup-AzureRmRecoveryServicesBackupItem -Item $item -ExpiryDateTimeUTC $endDate

```

　続いて、Azモジュールの場合は以下です。「Set-AzureRmRecoveryServicesVaultContext」の代替コマンドである「Set-AzRecoveryServicesVaultContext」を実行すると非推奨の警告が表示されるため、このコマンドは使用せずに各コマンドで「vaultID」を指定するように変更しました。

```
##変数の指定
$vaultName = "<Recovery Services コンテナー名>"
$rgName = "<Recovery Services コンテナーが存在するリソースグループ名>"
$vmName = "<バックアップ対象の仮想マシン名>"
$date = <バックアップ保存日数>

## Recovery Services コンテナーの指定
$targetVault = Get-AzRecoveryServicesVault -Name $vaultName -ResourceGroupName $rgName

## バックアップ対象の指定
$namedContainer = Get-AzRecoveryServicesBackupContainer -ContainerType "AzureVM" -Status "Registered" -FriendlyName $vmName -VaultId $targetVault.ID
$item = Get-AzRecoveryServicesBackupItem -Container $namedContainer -WorkloadType "AzureVM" -VaultId $targetVault.ID

##バックアップデータの保存期間を指定
$endDate = (Get-Date).AddDays($date).ToUniversalTime()

##バックアップジョブの実行
$job = Backup-AzRecoveryServicesBackupItem -Item $item -VaultId $targetVault.ID -ExpiryDateTimeUTC $endDate

```
　勿論以上のコマンドはAzure Backupを実行する部分のみのコマンドですので、Azure AutomationのRunbookには、Azure AutomationにてAzure サブスクリプションにログインする為のコマンドを冒頭に記載する必要が有ります。Azure Automationデプロイ時に既定で存在するRunbook「AzureAutomationTutorialScript」の冒頭部分をそのままコピー＆ペーストすれば問題ありません。

　Azure AutomationのRunbookの一覧から「AzureAutomationTutorialScript」を選択します。
![cap02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531201/7a710017-9dab-2741-d2e4-3209347b7641.png)


「AzureAutomationTutorialScript」の編集画面を確認し赤枠の箇所をそのまま使用します。
![cap03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531201/2b7ac9c6-3582-037a-c253-39e79d1eef1e.png)




※ Azモジュールの場合についてはチュートリアルのスクリプトが有りませんが、「Login-AzureRmAccount」コマンドを「Login-AzAccount」と変更するのみで問題ありません。但し、Azure Automationの実行環境が既定ではAzureRMモジュールであるため、事前にAzモジュールをインポートする必要が有ります。


　コマンドの準備が整いましたら、最後にバックアップを取得したい日時に合わせてAzure Automationのスケジュールを作成しRunbookに関連付ければ作業は終了です。

#注意点
　最後に補足としてこの方法を採用する上での注意事項を2点記載します。

- Azure Backupのスケジュールによる通常のバックアップも実行されます。Azure BackupのスケジュールとAzure Automationのスケジュールが重なると、同時に複数のバックアップジョブがトリガーされ一方がエラーとなります。

- 1日当たり同一のバックアップ対象について手動バックアップを実行できる回数に上限がございます。上限については非公開情報であり予告なく変更されることも有り得ます。本記事執筆時点では上限は4回です。ちなみに半年ほど前は10回でした。

　前者の場合、バックアップのジョブ自体はトリガーされるものの、Azure Backupのバックジョブ画面にて以下のエラーが表示されます。
「Unable to initiate backup as another backup operation is currently in progress.」

![cap04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531201/abff3cc2-d88b-0fbe-35e7-d70da5aa5126.png)

　後者の場合、バックアップのジョブのトリガー自体が失敗し、Azure Automation ジョブにて以下のエラーが表示されます。 
「Operation is blocked as you have reached the limit on number of operations permitted in 24 hours.」

![cap05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531201/77058583-7071-6bfb-fef5-dca9817e9654.png)