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) > 概要” title=”App Service (1) > 概要”></li>
<li>ストレージ アカウント<br />
<img src=$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) > 構成 > アプリケーション設定 (リストア後)” title=”App Service (2) > 構成 > アプリケーション設定 (リストア後)”></li>
</ul>
<h2>まとめ</h2>
<ul>
<li>ストレージ アカウントの SAS には、「アカウント SAS」、「サービス SAS」の 2 種類がある。</li>
<li>App Service のリストア コマンド ( <code>Restore-AzWebAppBackup</code> ) のときに使用する SAS は、「サービス SAS」。</li>
</ul>
<h2>おわりに</h2>
<p>なんらかの理由で、『別の App Service にリストアしたい』となったとき、この記事と同じミスが原因で、悩む方がいるかもしれません。<br />
この記事が、そんな方の突破口になったら、幸いです。</p>
<div class='wp_social_bookmarking_light'>
            <div class=
Pocket