Azure PowerShell を使用して App Service をリストアしてみた
はじめに
Azure の App Service には、ストレージ アカウントを使用したバックアップ・リストアの機能が用意されています。
この機能は、Azure ポータルはもちろん、Azure CLI や Azure PowerShell などのスクリプトからも使用できます。
今回は “Azure PowerShell を使用した App Service のリストア” で、私がハマったことを共有します。
使用するツール類
Azure ポータル
Azure Cloud Shell
検証
App Service 、ストレージ アカウントの準備 (バックアップ元)
検証のため、App Service とストレージ アカウントを、東日本リージョンに作成しました。
App Service (1)
ストレージ アカウント
リストアしたときにわかりやすくするために、App Service のアプリケーション設定を追加します。
App Service (1) > 構成 > アプリケーション設定
バックアップ構成、バックアップ実行
App Service のバックアップ構成を設定します。
App Service (1) > バックアップ構成
設定したら、さっそくバックアップを実行します。
App Service (1) > バックアップ実行
バックアップ ファイルが、ストレージ アカウントに格納されました。
ストレージ アカウント > バックアップ ファイル
App Service 準備 (リストア先)
リストア先となる App Service を、東日本リージョンに作成しました。
App Service (2)
この時点では、App Service のアプリケーション設定は登録されていません。
App Service (2) > 構成 > アプリケーション設定 (リストア前)
リストア実行 (アカウント SAS)
新たに作成した App Service ( tst-mm-a007-2-app ) に対して、リストアを実行したいと思います。
リストアするには、ストレージ アカウントで SAS を発行する必要があるので、Azure ポータルで SAS を発行します。
(あえて、すべての操作を許可します。)
ストレージ アカウント > Shared Access Signature
発行した SAS を使用して、Azure Cloud Shell で下記のコマンドを実行し、リストアを開始します。
$sasToken = "{SASトークン}"
# リストア対象の App Service を取得
$webApp = Get-AzWebApp `
-ResourceGroupName "tst-mm-a007-rgp" `
-Name "tst-mm-a007-2-app"
# リストア実行
Restore-AzWebAppBackup `
-AppServicePlan "tst-mm-a007-app-plan" `
-WebApp $webApp `
-StorageAccountUrl "https://tstmma0071sa.blob.core.windows.net/tst-mm-a007-1-app-backup${sasToken}" `
-BlobName "tst-mm-a007-1-app_202203080638.zip" `
-IgnoreConflictingHostNames `
-Overwrite
そうすると、下記のエラーメッセージが表示され、リストアに失敗します。
Restore-AzWebAppBackup: Long running operation failed with status 'InternalServerError'.
すべての操作を許可して発行した SAS のため、権限不足によるエラーではありません。
また、ストレージ アカウントのファイアウォールは「すべてのネットワーク」になっているので、これが原因でもありません。
なぜ、失敗してしまうのでしょうか…
SAS の種類
実は、ストレージ アカウントの SAS には、下記の 2 種類が存在します。
アカウント SAS
ストレージ アカウント単位の SAS 。
サービス SAS
Blob、Queue、Table、または File サービスのいずれか 1 つのストレージサービスにおける SAS 。
App Service のリストアは、 「サービス SAS」のみ使用可能 です。
上述の方法で取得した SAS は「アカウント SAS」となり、リストアでは使用できない SAS となります。
これが、リストアに失敗した理由となります。
リストア実行 (サービス SAS)
「サービス SAS」 を使用して、リストアを再実行してみます。
$rgpName = "tst-mm-a007-rgp"
$saName = "tstmma0071sa"
# ストレージ アカウントのコンテキストを取得
$saKeys = Get-AzStorageAccountKey `
-ResourceGroupName "${rgpName}" `
-Name "${saName}"
$ctx = New-AzStorageContext `
-StorageAccountName "${saName}" `
-StorageAccountKey "$($saKeys[0].Value)"
# 「サービス SAS」を発行
# (権限 : 読み取り、リスト)
$startTime = Get-Date
$endTime = $startTime.AddHours(2)
$sasToken = New-AzStorageContainerSASToken `
-context $ctx `
-Name "tst-mm-a007-1-app-backup" `
-Permission rl `
-StartTime $startTime `
-ExpiryTime $endTime
# リストア対象の App Service を取得
$webApp = Get-AzWebApp `
-ResourceGroupName "${rgpName}" `
-Name "tst-mm-a007-2-app"
# リストア実行
Restore-AzWebAppBackup `
-AppServicePlan "tst-mm-a007-app-plan" `
-WebApp $webApp `
-StorageAccountUrl "https://tstmma0071sa.blob.core.windows.net/tst-mm-a007-1-app-backup${sasToken}" `
-BlobName "tst-mm-a007-1-app_202203080638.zip" `
-IgnoreConflictingHostNames `
-Overwrite
こちらの方法だと、リストアに成功するはずです。
App Service のアプリケーション設定を確認してみると、値が復元されています。
App Service (2) > 構成 > アプリケーション設定 (リストア後)
まとめ
ストレージ アカウントの SAS には、「アカウント SAS」、「サービス SAS」の 2 種類がある。
App Service のリストア コマンド ( Restore-AzWebAppBackup ) のときに使用する SAS は、「サービス SAS」。
おわりに
なんらかの理由で、『別の App Service にリストアしたい』となったとき、この記事と同じミスが原因で、悩む方がいるかもしれません。
この記事が、そんな方の突破口になったら、幸いです。