AzurePaaS研究サイト

~理解しずらい情報をシンプルにお伝えします~

AppService/Functionsのメンテナンスはいつ何が行われるか・行われるとどうなるか

AppService/Functionsのメンテンスを説明

 
あまりここまで書いてる情報はないと思います。公式ドキュメントにもここまで整理して書かれてるページがなかったので、攻めて書いてみました。ご参考いただければと思います。

メンテナンスが必要な理由

AppService/Functions などの Azure の各サービスは、たとえば日本のデータセンター(東日本・西日本)の中に、大量のサーバが設置されていて、そのサーバの仮想環境でアプリケーションなどが構築・実行されています。
 
Azure ユーザは、AppService/Functions 上にアプリケーションをデプロイして実行されていますが、その実行されているサーバには他のユーザのアプリケーションもたくさん同時に実行されています。
 
複数ユーザが共有して利用されているサーバでは、ひっきりなしにリソースが新規作成されたり削除されたりアプリケーションが実行されたり停止されたりするので、サーバを正常状態に保って複数のアプリケーションを正常に動作し続けるためには、日常的なメンテンスが必要不可欠となります。さらに、Azure 機能を AppService/Functions にアップグレードなども繁栄していく必要があります。
 
なので、Azure などのクラウドサービスがメンテナンスを行うのは当然ということを、まず理解する必要があります。  

メンテナンスの種類といつ行われてるか

メンテナンスは大きく2つに分けられます。予定されてるメンテナンスと、予定外のメンテナンスがあり、それぞれ実行されるタイミングが変わります。
 

予定しているメンテナンス

原則、深夜などのビジネスタイム外の時間帯にメンテナンスが行われます。たとえば、ANT のサーバに関する月1定期メンテナンスのようなものもあります。

予定外のメンテナンス

メンテナンスを行わないと Azure 側のサーバが正常に動作できないと判断した際に実施される、予定外のメンテナンスは必要に応じて実施されるので、時間帯に関係なく実施されます。緊急メンテナンスというわけではなく、Azure 側としては想定しているメンテナンスです。
 

メンテナンスとは具体的に何が行われるのか

メンテナンスとひと言でいっても実際になにをやっているのでしょうか。代表的な例を紹介します。

設定ファイルの入れ替えなど

サーバ内の設定ファイルを入れ替えるだけのようなメンテナンスもあります。

Azure 環境のアップグレード

機能変更や障害改修されて、AppService など自体が新しいバージョンにアップグレードされます。

定期メンテナンス

たとえば、ANT サーバの月1定期メンテナンスのようなものもあります。

実行中インスタンスの負荷が上がりインスタンスを切り替え

アプリケーションが実行中のインスタンスの負荷が上がったり、何かしらの問題が発生した場合に、別のインスタンスに切り替わったりします。

 

メンテナンスが行われるとどうなるのか

場合によってはインスタンスが切り替わる

 AppService/Functions のアプリケーションはずっと同じインスタンス上で実行されているわけではありません。これは、どの料金プランを利用していても共通の話です。
更に、メンテナンス実施=必ずインスタンスの切り替えが発生するわけではないので覚えておいてください。
 
 
アプリケーション実行中にインスタンス切り替えが起こるとどうなるのか?
 
  まず前提としては、インスタンス上でアプリケーションが処理中に割り込んで、処理を中断させてメンテナンスが実施されてしまわないような仕組みになってます。

クライアント -> (インターネット) -> FrontEnd -> WebWorker(インスタンス)
という構成でインスタンスの切り替えが発生した際、アプリケーション自体は新しいインスタンスで起動し直されます。
また、原則リクエスト処理が完了した時点で新しいインスタンスへの切り替えを行っており、切り替え完了後 FrontEnd のリクエストキューに溜まっているリクエストを FrontEnd から新しいインスタンスに転送されて、引き続きアプリケーションが実行されるという動作になります。
 
 
そもそも、なぜインスタンス切り替えが起きるのか?
 
 Azure 側が想定・予定しているケースとしては、以下に記載する『Azure 環境のアップグレード』の際に、アップグレードしようとしたインスタンスが誰かにアプリケーション実行中の場合は、"このインスタンスメンテナンスしたいから、別のインスタンスに移動して残りのリクエスト分の処理してね" という感じで、未処理のリクエスト処理が FrontEnd に残っていても別のインスタンスに移動させられます。
 
Azure 側が想定・予定していないケースとしては、実行中のインスタンスで問題が発生したら、Azure が勝手に他の正常なインスタンスに切り替えて、継続してアプリケーションが実行できるようにしてくれています。
 
どちらにしても、アプリケーションが正常に継続実行できるようにしてくれている仕組みなので、何でインスタンスの切り替えなんて発生するんだ!などと言わないようにしましょう。
 
 
アプリケーションの待ち時間(実行されていない時間)が少し発生したのはなぜ?
 
 それはインスタンスの切り替えが発生して、新しいインスタンスで実行するまでの待ち時間が発生していた可能性があります。
 
そして、プラス料金発生せずに、インスタンス切り替えの待ち時間が発生しない仕組みがあります!
AppServiceプランを使用している場合、「AppService/Functions > 構成 > 全般設定タブ > 常時接続」
こちらの常時接続機能を ON にすると、Azure 側でインスタンスが常に起動されるようになるため、アプリケーション起動時の待ち時間などは発生しません。デフォルトでは OFF になってしまっているので必要なら ON にしましょう。
 

SQLDatabase/StorageAccount 等がメンテナンス中の場合

 アプリケーション処理から SQLDatabase/StorageAccount 等にアクセスした際、SQLDatabase/StorageAccount 等でメンテナンスが発生していると 503 エラー等が発生したりします。AppService/Functions のアプリケーションとしてできることは、SQLDatabase/StorageAccount 等にアクセスしている箇所に再送(リトライ)を組み込むことです。
 
SQLDatabase/StorageAccount 等でメンテナンスが発生することも想定した実装していなくて、リトライすれば SQLDatabase/StorageAccount 等へのアクセスが成功していたのに・・・ということになるともったいないです。  

メンテンスが行われていたか調べる方法

ポータル画面で確認

残念ながら、「メンテナンスが発生していたかどうか」自体を確認する方法はありません。なので、代替案を紹介します。
 

問題の診断と解決で「Web App Restarted」を利用する

AppService/Functions の [問題の診断と解決] で「Web App Restarted」を検索すると、再起動の発生有無が確認できます。Azure 側がきっかけで再起動が発生していた=メンテナンスが発生していた可能性が高い、ということがわかります。

問題の診断と解決で「CPU ...」を利用する

この画面で使用されていたインスタンス ID が確認できるので、インスタンス ID が変わっていたら、インスタンスの切り替えが発生していたということが確認できます。
 

Microsoft の Azure サポートに問い合わせる

有償サポート契約が必要になりますが、Microsoft の Azure サポートに問い合わせると、該当時間帯にメンテナンスが行われていたかどうか教えてくれます。ただ、ユーザ自身が [問題の診断と解決] で確認できる情報と同じ調査結果がもらえるだけ、という可能性が高いと思っておいた方がいいと思います。
 
しかし、Azure サポート側もいつメンテナンスが行われていた。という情報をもっているわけではないらしいので、Azure 側がきっかけでアプリケーションを再起動した、というログを確認した=メンテナンスが発生していたのだろう。という推測をもとに答えるしかできないようです。
 
先述したとおり、AppService/Functions の [問題の診断と解決] でも「この日時にAzure がきっかけでアプリケーション再起動された」「この日時にユーザきっかけでアプリケーション再起動された」というログが確認できるので、Azure 側がきっかけでアプリケーション再起動された場合は、メンテナンスが発生していたのだろう。ということは Azure サポートに問い合わせなくてもユーザ側で確認することができますので、覚えておいてください。
 

メンテンスの事前通知されないのか・設定できるか

 
事前通知もされませんし、事前通知できるような設定も用意されてません。
 
そもそも事前通知がされたら、どうするつもりなのでしょうか。
事前通知を受けたら、一時的に Azure 側にリクエストを送信しないように制御でもするのでしょうか。
そのようなことをしたら、メンテナンスの具体例を先述しましたが、そのすべてにおいてアプリケーションを止めますか?という話になってしまいます。
 
メンテナンスの多くは数秒レベルで終わることが多いので、Azure 側へのリクエスト送信処理にはリトライ処理を組み込む。という対策をしたり、クラウド上でアプリケーションを動作するために必要な考え方を学んで、実践してしまった方が早いと思います。オンプレのときは考えなくてよかったのに、という気持ちはわかりますが、クラウドのメリットは無数にあるのでクラウドの恩恵を受ける代わりに、メンテナンスの発生を受け入れるということが必須の考え方になりますので、ご理解いただければと思います。
 
事前通知ができない理由・・・考えても仕方がありませんので書きません。
それよりは、以下にメンテナンスの影響を軽減させる方法を紹介しますので、ご検討いただくことを推奨します。

メンテンスの対策

アプリケーションを継続実行させるための対策

Azure 有償サポートなどでも推奨されている対策を、4つ紹介します。

AppServiceプランのインスタンスを2つ以上で運用する

 
AppServiceプランを使用している場合の対策になります。
インスタンス数が 1 だとインスタンスが全く使えなくなる時間が発生する可能性が高まるため、インスタンスに影響するメンテナンスが発生した場合に、アプリケーションが遅延または一時停止してしまうことがあります。
 
容易な対策としては、スケールアウトしてインスタンス台数を 2 台以上にします。メンテナンスはスタンプ内のインスタンスを少しづつ順番にメンテナンスしていくので、インスタンスAはメンテナンスで使えなくなってしまうがインスタンスBはメンテナンスが行われていないため、メンテナンスによってアプリケーションが一時停止してしまう可能性を下げることができます。
 
ただ、これはあくまでも「メンテナンスの影響を受ける可能性を容易に下げられる対策」であることを理解いただければと思います。 docs.microsoft.com

アプリケーションを複数リージョンにデプロイして主と副で運用する

 
具体例でいうと、ひとつのAppServiceを「東日本リージョンにデプロイ」(プライマリリージョン)、もうひとつのAppServiceを「西日本リージョンにデプロイ」(セカンダリリージョン)をそれぞれ構築します。
 
そして、FrontDoor などでアクティブなAppServiceをコントロールしてもらう方法です。

docs.microsoft.com

TrafficManager で利用できないインスタンスを避ける

 
Traffic Manager は定期的に AppService/Functions のエンドポイントを監視し、問題が発生したリージョンから、別のリージョンへリクエストをルーティングを行うことが可能です。

docs.microsoft.com

docs.microsoft.com

リトライ処理をアプリケーションに組み込む

これは Azure 関係なく、アプリケーションに組み込まれているのが常識だと思います。基礎的で一番大事な対策です。
 
メンテナンスは短い時間で終わることが多いので、もう一度リトライすれば正常に進んだのに!ということが起きないように、リトライ処理を入れておくのは必須になります。 docs.microsoft.com

セーフティにアプリケーションをダウンさせる対策

アプリケーションが中途半端な状態で強制終了させられないよう、正常にアプリケーションを終了させるための仕組みです。

Graceful Shutdown に対応する

アプリケーションの整合性を維持するための仕組みです。 この仕組みまで入れると、デプロイを実行する際タイミングを意識せずに実行できたりします。

docs.microsoft.com

dev.to

AppService/Functions に関するメンテナンスの情報を書けるだけ書きましたがいかがでしたでしょうか。
ご理解いただけているとは思いますが、Azure 構成とアプリケーション実装を駆使して、メンテナンスの影響を受けずにアプリケーションの可用性の維持を目指していきたいですね。
 
以上です。
 

ご意見・ご要望はこちらへ