はじめに
Azure App Serviceでは2つのスロットをスワップすることで、ダウンタイム無しでリリースすることが出来ます。
そのスワップ中に「インスタンスが再起動する」と説明にあるのですが、実際は再起動しないケースがありました。
結論
マイクロソフト サポートに問い合わせた結果、
スロット間でアプリケーション設定に差異がない場合は再起動しない
ということが分かりました。
これは不具合などではなく正しい動作、とのことです。
何が起こったのか
運用中のアプリケーションではWinCacheを使用したキャッシュ戦略を構成しています。
アプリケーションをリリースする時は、スワップ時の再起動によりキャッシュデータがクリアされることを想定していました。
しかし、このキャッシュデータに変更が生じるアップデートをリリースした時、キャッシュデータが更新されていないと思われる現象が発生し、アプリケーションエラーによりサービスがダウンしました。
原因が判明するまでの経緯
スワップ時の再起動によりキャッシュデータがクリアされることを想定していました。
これは動作確認した結果を踏まえて手順を構成したのですが、実際に運用していて、スワップ時の挙動に疑問を感じることがありました。
そこで、そもそも「スワップ時にインスタンスが再起動する」という認識は正しいのか、という点から調べることにしました。
その結果、これらのことが判明しました。
- スロット間でアプリケーション設定に差異がない場合は再起動しない
- 当時のログから、再起動はされなかった
- アプリケーション設定に差異は無かった
よって問題が起こった原因は「アプリケーション設定に差異は無かったのでスワップ中に再起動せず、キャッシュデータがクリアされなかった」という結論に至りました。
解決方法について
これから上記の事実を踏まえて「リリース時にキャッシュデータをクリアする方法」を改めて考えることになります。
現状の手順で考えるなら、適当な設定(バージョン番号やリリース日時)などで差異を作って再起動を強制する方法があると思います。
また再起動は手段でしかないので、カスタムウォームアップを利用するのも良さそうです。
ちなみに、スワップ中の再起動を強制するオプションのようなものは無い、とのことです。
おわりに
Webアプリケーションに関する情報はLAMP環境が多いので、AzureやIISに関する調査は苦労します。
何かの参考になれば幸いです。