Azure App ServiceのスロットSwap中に503になる問題とSwap with previewの使い方

Higtyの開発日記

Azure App ServiceのSwapで一時的にアクセス不能になる

Azure App ServiceにはDeployment slotsという機能があります。

本番環境とは別にstagingスロットを用意しておき、stagingに新しいアプリをデプロイしてからproductionとSwapすることで、ダウンタイムを抑えたリリースができます。

通常は以下のようにSwapします。

Source: higlabo-staging
Target: higlabo (PRODUCTION)

この向きであれば、staging側をproductionに昇格させる形になります。

しかし実際に運用していると、Swap中またはSwap直後に以下のような画面になることがあります。

The service is unavailable.

いわゆる503です。


Swapの向きは正しいのに503になる

Azure PortalのSwap画面で以下のようになっていれば、Swapの向き自体は正しいです。

App ServiceのSwapでは、基本的にはSource側を準備してからTarget側に切り替えます。

そのため、Sourceをstaging、Targetをproductionにしておけば、本番側を直接止めるような動きにはなりません。

それでも503になる場合、原因としては以下が考えられます。

・staging側のアプリが十分にウォームアップされていない

・本番設定を適用した状態でstagingが起動できない

・DB接続文字列や環境変数がSwap後に想定外の値になっている

・独自ドメインやホスト名バインディング周りで再起動が発生している

・アプリ起動時の初期化処理が重い

・起動時マイグレーションなどで失敗している

特に怖いのは「stagingでは動いていたが、productionの設定を適用すると起動できない」というケースです。

この問題を本番切替前に検出するために、Swap with previewを使います。


Swap with previewとは?

Swap with previewは、いきなりproductionに切り替えるのではなく、まずstaging側にproductionのスロット設定を適用して確認できる機能です。

流れとしては以下になります。

  1. stagingに新しいアプリをデプロイする
  2. Swap with previewを開始する
  3. stagingにproduction側の設定が適用される
  4. stagingが再起動・ウォームアップされる
  5. staging URLで動作確認する
  6. 問題なければComplete Swapする
  7. 問題があればCancel Swapする

つまり、本番に切り替える前に「production設定で本当に起動できるか」を確認できます。


Perform swap with previewが選べない

Azure PortalでSwap画面を開いたところ、以下のようなメッセージが表示されている場合があります。

Swap with preview can only be used with sites that have deployment slot settings enabled.

Image

この状態では、Perform swap with preview のチェックボックスが無効になっています。

原因は、Deployment slot settingが有効なApp SettingまたはConnection Stringが存在しないためです。


SLOT_NAMEを追加する

Swap with previewを有効にするため、productionとstagingの両方にスロット固定のApp Settingを追加します。


production側には以下を追加します。

Name: SLOT_NAME
Value: production
Deployment slot setting: ON


staging側には以下を追加します。

Name: SLOT_NAME
Value: staging
Deployment slot setting: ON


ポイントは、設定名は両方とも同じ SLOT_NAME にして、値だけ変えることです。

Deployment slot setting をONにすると、その設定はSwapされず、そのスロットに固定されます。

つまりSwap後も、

production側: SLOT_NAME=production
staging側: SLOT_NAME=staging

のままになります。

この設定を追加して保存すると、Swap画面で Perform swap with previewが選択できるようになります。


Swap with previewを実行する

設定後、stagingスロットのSwap画面を開きます。

Source: higlabo-staging
Target: higlabo (PRODUCTION)

になっていることを確認します。


その後、以下にチェックを入れます。

Perform swap with preview

そして Start Swap を押します。

この時点では、まだproductionへの切り替えは完了していません。

Azure側でstagingにproduction側の設定を適用し、stagingを再起動・準備する段階で止まります。

この状態でstagingのURLを確認します。

https://higlabo-staging.azurewebsites.net/home

ここで問題なく表示されれば、production設定を適用した状態でもアプリが起動できているということになります。

問題なければ Complete Swap を押します。

もし503になる場合は、Complete Swap せずに Cancel Swap します。

これにより、本番環境に壊れた状態を流す前に止めることができます。


Warmup用の設定も追加する

Swap中の503を減らすには、ウォームアップ用のエンドポイントを指定するのも重要です。

例えば /healthcheck という軽いエンドポイントを用意して、200 OKを返すようにします。

そのうえで、productionとstagingの両方に以下のApp Settingを追加します。

WEBSITE_SWAP_WARMUP_PING_PATH=/healthcheck
WEBSITE_SWAP_WARMUP_PING_STATUSES=200
WEBSITE_WARMUP_PATH=/healthcheck
WEBSITE_WARMUP_STATUSES=200

WEBSITE_SWAP_WARMUP_PING_PATH は、Swap時にApp Serviceがウォームアップ確認としてアクセスするパスです。

デフォルトでは / にアクセスします。

しかしトップページは認証、DBアクセス、外部API、リダイレクトなどを含むことがあり、ウォームアップ用としては重すぎる場合があります。

そのため、Swap用には軽量なhealth checkエンドポイントを用意する方が安全です。


独自ドメインを使っている場合の設定

独自ドメインを設定しているApp Serviceでは、Swap後にホスト名バインディングの差分によって予期しない再起動が発生することがあります。

この対策として、全スロットに以下を追加します。

WEBSITE_ADD_SITENAME_BINDINGS_IN_APPHOST_CONFIG=1

今回のように独自ドメインでアクセスしていて、Swap後に一時的に503になる場合は、この設定も試す価値があります。

ただしWCFアプリでは使わない方がよいようです。通常のASP.NET Coreアプリであれば検討できます。


最終的なSwap手順

今回の構成では、以下の流れにすると安全です。

  1. stagingにデプロイ
  2. staging URLで通常確認
  3. Perform swap with preview をON
  4. Start Swap
  5. production設定が適用されたstagingを確認
  6. 問題なければ Complete Swap
  7. 問題があれば Cancel Swap

確認するURLはproductionではなくstagingです。

https://higlabo-staging.azurewebsites.net/home

この段階で503になる場合、本番切替前に問題を検出できたことになります。


まとめ

Azure App ServiceのSwapはゼロダウンタイムに近いリリースを実現する便利な機能です。

しかし、stagingで動いていることと、production設定を適用した状態で動くことは別です。

Perform swap with preview を使うことで、productionに切り替える前にproduction設定を適用した状態のstagingを確認できます。

今回行った対応は以下です。

SLOT_NAME=production
SLOT_NAME=staging

をそれぞれのスロットに追加し、Deployment slot setting をONにしました。

これにより Perform swap with preview が有効になりました。

さらに、Swap時の安定性を高めるには以下も設定します。

WEBSITE_SWAP_WARMUP_PING_PATH=/healthcheck
WEBSITE_SWAP_WARMUP_PING_STATUSES=200
WEBSITE_WARMUP_PATH=/healthcheck
WEBSITE_WARMUP_STATUSES=200
WEBSITE_ADD_SITENAME_BINDINGS_IN_APPHOST_CONFIG=1

App ServiceのSwapで一時的に503になる場合は、まずSwapの向き、Deployment slot setting、Swap with preview、Warmup設定を確認するとよさそうです。

In this article
Azure App ServiceのSwapで一時的にアクセス不能になる
Swapの向きは正しいのに503になる
Swap with previewとは?
Perform swap with previewが選べない
SLOT_NAMEを追加する
Swap with previewを実行する
Warmup用の設定も追加する
独自ドメインを使っている場合の設定
最終的なSwap手順
まとめ