はじめに
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 にリストアしたい』となったとき、この記事と同じミスが原因で、悩む方がいるかもしれません。
この記事が、そんな方の突破口になったら、幸いです。