![見出し画像](https://assets.st-note.com/production/uploads/images/125912551/rectangle_large_type_2_f8e052caf7bf055725f5747a6f7f165c.png?width=1200)
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 (1) > 概要](https://assets.st-note.com/img/1702888117-80gYTEYs2j.png?width=1200)
ストレージ アカウント
![ストレージ アカウント > 概要](https://assets.st-note.com/img/1702888118-0il2Fzlw81.png?width=1200)
リストアしたときにわかりやすくするために、App Service のアプリケーション設定を追加します。
App Service (1) > 構成 > アプリケーション設定
![App Service (1) > 構成 > アプリケーション設定](https://assets.st-note.com/img/1702888119-B5XMQvUp7X.png?width=1200)
バックアップ構成、バックアップ実行
App Service のバックアップ構成を設定します。
App Service (1) > バックアップ構成
![App Service (1) > バックアップ構成](https://assets.st-note.com/img/1702888120-xqPqJluJ3K.png?width=1200)
設定したら、さっそくバックアップを実行します。
App Service (1) > バックアップ実行
![App Service (1) > バックアップ実行](https://assets.st-note.com/img/1702888122-vdHnNFLiaF.png?width=1200)
バックアップ ファイルが、ストレージ アカウントに格納されました。
ストレージ アカウント > バックアップ ファイル
![ストレージ アカウント > バックアップ ファイル](https://assets.st-note.com/img/1702888123-53KkbsPvBc.png?width=1200)
App Service 準備 (リストア先)
リストア先となる App Service を、東日本リージョンに作成しました。
App Service (2)
![App Service (2) > 概要](https://assets.st-note.com/img/1702888124-OZVeu2sl0q.png?width=1200)
この時点では、App Service のアプリケーション設定は登録されていません。
App Service (2) > 構成 > アプリケーション設定 (リストア前)
![App Service (2) > 構成 > アプリケーション設定 (リストア前)](https://assets.st-note.com/img/1702888125-ltOjlqyVsI.png?width=1200)
リストア実行 (アカウント SAS)
新たに作成した App Service ( tst-mm-a007-2-app ) に対して、リストアを実行したいと思います。
リストアするには、ストレージ アカウントで SAS を発行する必要があるので、Azure ポータルで SAS を発行します。
(あえて、すべての操作を許可します。)
ストレージ アカウント > Shared Access Signature
![ストレージ アカウント > Shared Access Signature](https://assets.st-note.com/img/1702888126-JMZfbXrl2G.png?width=1200)
発行した 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) > 構成 > アプリケーション設定 (リストア後)
![App Service (2) > 構成 > アプリケーション設定 (リストア後)](https://assets.st-note.com/img/1702888127-VZTUzwoCkE.png?width=1200)
まとめ
ストレージ アカウントの SAS には、「アカウント SAS」、「サービス SAS」の 2 種類がある。
App Service のリストア コマンド ( Restore-AzWebAppBackup ) のときに使用する SAS は、「サービス SAS」。
おわりに
なんらかの理由で、『別の App Service にリストアしたい』となったとき、この記事と同じミスが原因で、悩む方がいるかもしれません。
この記事が、そんな方の突破口になったら、幸いです。