[Windows Azure] Web Role/Worker Role でInitializing–Busy ステータスで再起動を繰り返す現象について

こんにちは。マイクロソフト デベロッパー サポート チームです。

デベロッパー サポート チームのブログですが、これからよろしくお願いいたします。よくあるお問い合わせや、開発時に役立つこと、トラブルシュートの方法など、案内できればと思っています。早速、本日は、よくある問い合わせの 1 つである、Windows Azure の Role のリサイクルが繰り返される問題の対応方法について紹介したいと思います。

問題

Windows Azure 上に Web Role などを配置したときに、アプリケーションがうまく起動せずにステータスが Initializing -> Busy を繰り返す。

原因

この原因は、利用している Role の初期化処理に問題があり、内部的なエラー発生などで、うまく起動できないときに現象が発生します。

- 詳細
Web Role / Worker Role などは、起動時に OnStart メソッドなどが呼び出され初期化処理や Run メソッドで実行時処理を行うことが可能です。しかし、初期化処理などで例外などが発生してしまった場合には、Role の起動に失敗しまいます。その結果、Role をホストしているアプリケーションも異常終了します。

そうなると、Windows Azure の各 Virtual Machine を管理している Fabric Controller が、異常を検知して、改めて各 Role を再起動しようとします。その結果、ステータスが Initializing -> Busy を繰り返します。

対応策

配置しているアプリケーションの構成に問題がないか、起動時のコードに問題がないかを確認します。特に、Azure OS はクリーンな Windows Server 2008をベースとした環境ですので、サードパーティ製の GAC 登録されたモジュールを使っていないか等、環境の違いに注目して確認したりすることも有効です。

また、Windows Azure SDK 1.2 を利用している場合には、WaWebHost.exe が Web アプリケーションをホストしているため、web.config ファイルもこの内部で利用されています。

もし、無効な web.config ファイルが読み込まれた場合には、起動に失敗するばあいもありますので、web.config の設定に問題がないかも確認いただく必要があります。WaWebHost.exe は IIS 7.0 ベースの統合モードで動作するため、そのあたりの設定に問題がないかについても、確認いただくとよいかと思います。

気を付けるポイント:

  • OnStart メソッドで、ハンドルされない例外が発生していないか
  • OnStart メソッドで、Diagnostic Monitor の設定をしているときに、設定に間違いがないか
  • Azure に設定している構成ファイルに、文法的な間違いはないか
  • Azure Guest OS に配置されていない DLL を使っていないか
  • GAC 登録が必要なサードパーティ製のコンポーネントを利用していないか
  • Azure OS は 64 ビットで動作していますが、C++ で作られたネイティブコンポーネントを使っている場合、間違って 32 ビット用のモジュールを使っていないか
  • 各 Role は管理者権限で動作しませんが、初期化の時に、管理者権限が必要な処理をしていないか

補足

Web Role / Worker Role のホスト アプリケーションは、以下の通りです。

Windows Azure SDK 1.2

Role Host Name Memo
Web Role WaWebHost.exe IIS の HWC 機能を利用して専用プロセスでホストしています。
Worker Role WaWorkerHost.exe  

   Creating Hosted Web Core (HWC) Applications [IIS 7]
   msdn.microsoft.com/en-us/library/ms689327(VS.90).aspx

Windows Azure SDK 1.3

Role Host Name Memo
Web Role

WaIISHost.exe IIS (w3wp.exe)

既定で IIS でホストするようになっています
Worker Role WaWorkerHost.exe  

Windows Azure を管理している Fabric Controller は、各ホスト アプリケーションの生存を確認しています。もし各ホスト アプリケーションがクラッシュした場合には、Fabric Controller はホストを再起動しようとします。その際には、Windows Azure Management Portal (https://windows.azure.com) で、表示上 Initializing -> Busy の処理が走っているように見えます。

以上ご参考をいただければ幸いです。

--
デベロッパー サポート
平原