Azure 仮想マシンのバックアップを自動化しよう

Azure仮想マシンの二つのバックアップ方法

Azure仮想マシン(IaaS)の場合、当然ですが運用管理の一つとして、バックアップという戦略が必須として出てきます。
Azureには現時点で仮想マシンのバックアップには、ざっくり二つの方法があります。

  1. Azure Backup
  2. Azure Storageのスナップショット機能を使う

Azure Backup(https://azure.microsoft.com/ja-jp/services/backup/)は、主にバックアップのエージェントを別途インストールして、AzureStorageに暗号化してバックアップします。効率的に増分バックアップが可能です。

Azure仮想マシンでのAzure Backupの方法は以下を参考にしてください。
https://azure.microsoft.com/ja-jp/documentation/articles/backup-azure-vms-prepare/

さて、ここからが本題になります。
現状、Azure仮想マシン(v2)と呼ばれる新しいタイプの仮想マシンは、Azure Backupに対応していないのです。

いずれ対応すると思いますが、2016年1月時点では対応していません。

という事で、2の方法使ってバックアップを行う事になります。

Azure Storageのスナップショット機能を使ったバックアップ、レストア

以下のコードは、ストレージアカウントのvhdsコンテナ配下に存在するVHDファイルすべてに、スナップショットを作成するスクリプトのサンプルです。


# ストレージアカウントの情報
$StorageAccountName = "snadummy7382"
$StorageAccountKey = "yWnjMr3kAdummycmOd/5QqMLoIdummyAiodummy51HsdummyLNODummyFNlArYGcsTiu9UQqNKeGOxWsBTk7fw=="
$ContainerName = "vhds"
$Ctx = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey

# ブロブストレージの参照
$blobs = Get-AzureStorageBlob -Context $Ctx -Container $ContainerName
foreach($blob in $blobs) {
    if((!$blob.ICloudBlob.IsSnapshot) -and ($blob.Name.EndsWith("vhd"))){
        # VHDイメージのスナップショットを行う
        $snap = $blob.ICloudBlob.CreateSnapshot()
    }
}

バックアップの自動化

Powershellかぁ、Windowsの話だな、俺はMacとLinux使ってるから関係ないな、とか思った人ほど、我慢してもう少し読んでください。

AzureにはAzure Automation(https://azure.microsoft.com/ja-jp/services/automation/)という機能があります。

これを使えばRunbookを作成して、定期的な実行ジョブなどを実行させる事ができます、しかもジョブ数少ないうちは無料なので、バックアップの自動化にはうってつけですね。

automation
vmbkrs2こういうのは、使ってみた方が理解が早いので、Azure Automationをポータルからサクッと作成してください。

Runbookの作成

  1. Automationのパネルに移動
  2. パネル上部のアイコンから設定をクリック
  3. 設定パネルからRunbookをクリックvmbkrs3
  4. パネル上部のアイコンからRunbookの追加をクリック
  5. Runbookの名前やRunbookの種類を決めます、ここではPowershellです
  6. このページからPowershellをコピペして貼り付けてください、上部のテストウィンドウをクリックするとテスト実行と簡単なデバッグなども可能ですvmbkrs4
  7. パネル上部のアイコンから、保存、公開(公開というより、発行の方が訳が良いかもなぁ)

これでRunbookの登録ができました、作成したRunbookのパネルを開いて開始をクリックすれば、その場でジョブが投入され即時実行となります。

スケジュールを登録

  1. 作成したRunbookのパネルを開いて、上部からスケジュールをクリック
  2. スケジュールをRunbookにリンクするをクリックして、新規スケジュールを作成
  3. ここでは日時バックアップを想定して、繰り返しAM5時で登録しています。

vmbkrs5

レストア(復元)

さて、バックアップを取得したら復元も大事です。復元のサンプルスクリプトを以下に記載します。適宜パラメータの所はレストアする対象VHDのイメージ名に変更しましょう。
復元に用いるPowershellスクリプトを以下に記載します、このスクリプトは指定したVHDファイルの一番直近のスナップショット時点まで復元します。


# ストレージアカウントの情報
$StorageAccountName = "snadummy7382"
$StorageAccountKey = "yWnjMr3kAdummycmOd/5QqMLoIdummyAiodummy51HsdummyLNODummyFNlArYGcsTiu9UQqNKeGOxWsBTk7fw=="
$Ctx = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey

# 復元するVHDを指定
$ContainerName = "vhds"
$BlobName = "snapshot20161416210.vhd"

# 現在のスナップショットを取得
$snapshots = Get-AzureStorageBlob –Context $Ctx -Prefix $BlobName -Container $ContainerName | Where-Object  { $_.ICloudBlob.IsSnapshot -and $_.Name -eq $BlobName }| Sort-Object SnapshotTime

# ターゲットのVHDイメージを取得
$vhdimage = Get-AzureStorageBlob –Context $Ctx -Prefix $BlobName -Container $ContainerName | Where-Object  { (!$_.ICloudBlob.IsSnapshot) -and $_.Name -eq $BlobName }

# 仮想マシンのVHDロックを解除
If($vhdimage.ICloudBlob.Properties.LeaseStatus -eq "Locked") 
{ 
    Try 
    { 
        $vhdimage.ICloudBlob.BreakLease($(New-TimeSpan), $null, $null, $null) | Out-Null
    } 
    Catch 
    { 
        Write-Host "Failed to break lease on '$vhdimage' blob." -ForegroundColor Red 
    } 
} 

# 最新のスナップショットを元のディスクに上書きコピー
Start-AzureStorageBlobCopy –Context $Ctx -ICloudBlob $snapshots[-1].ICloudBlob -DestBlob $BlobName -DestContainer $ContainerName -Force

復元作業

先ほどのバックアップと同じ要領で、復元用のスクリプトは登録してください。あとは、以下の手順で実行するだけで、スナップショットの時点まで復元を行う事ができます。

  1. ポータルから仮想マシンの停止
  2. 登録したレストアのRunbookをオンデマンドで実行vmbkrs6vmbkrs8
  3. 仮想マシンをポータルから起動すれは復元完了

いかがだったでしょうか?

Azureのポータルだけで、ここまでできますし、ブラウザであれば特にプラットフォームも選びません。

日ごろの運用作業の大半は繰り返し行われています、Azure AutomationはAzureのリソースのコントロールも含めて定型化できます。

実行結果の成功、失敗などもポータルからすぐ目視で確認できますし、実行結果ログの管理などもできます。今回のスクリプトにはあえて、VMの起動と停止は含めませんでしたが、含めることもできますし、例えば、ログやコンテンツは別ディスクで、毎日スナップショットから復元するVMなんてものも作れると思います。