Azure PowerShell を使用して App Service をリストアしてみた

Pocket

はじめに

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) > 概要
  • ストレージ アカウント
    ストレージ アカウント > 概要

リストアしたときにわかりやすくするために、App Service のアプリケーション設定を追加します。

  • App Service (1) > 構成 > アプリケーション設定
    App Service (1) > 構成 > アプリケーション設定

バックアップ構成、バックアップ実行

App Service のバックアップ構成を設定します。

  • App Service (1) > バックアップ構成
    App Service (1) > バックアップ構成

設定したら、さっそくバックアップを実行します。

  • App Service (1) > バックアップ実行
    App Service (1) > バックアップ実行

バックアップ ファイルが、ストレージ アカウントに格納されました。

  • ストレージ アカウント > バックアップ ファイル
    ストレージ アカウント > バックアップ ファイル

App Service 準備 (リストア先)

リストア先となる App Service を、東日本リージョンに作成しました。

  • App Service (2)
    App Service (2) > 概要

この時点では、App Service のアプリケーション設定は登録されていません。

  • App Service (2) > 構成 > アプリケーション設定 (リストア前)
    App Service (2) > 構成 > アプリケーション設定 (リストア前)

リストア実行 (アカウント SAS)

新たに作成した App Service ( tst-mm-a007-2-app ) に対して、リストアを実行したいと思います。
リストアするには、ストレージ アカウントで SAS を発行する必要があるので、Azure ポータルで SAS を発行します。
(あえて、すべての操作を許可します。)

  • ストレージ アカウント > Shared Access Signature
    ストレージ アカウント > 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) > 構成 > アプリケーション設定 (リストア後)
    App Service (2) > 構成 > アプリケーション設定 (リストア後)

まとめ

  • ストレージ アカウントの SAS には、「アカウント SAS」、「サービス SAS」の 2 種類がある。
  • App Service のリストア コマンド ( Restore-AzWebAppBackup ) のときに使用する SAS は、「サービス SAS」。

おわりに

なんらかの理由で、『別の App Service にリストアしたい』となったとき、この記事と同じミスが原因で、悩む方がいるかもしれません。
この記事が、そんな方の突破口になったら、幸いです。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です