クラウド・インテグレーションチームの開発者サポートエンジニアの視点からWindows Azure情報を共有するWindows Azure – トラブルシューティング&デバッギング Blogに投稿された「Windows Azure Role Architecture」をざっくり意訳した投稿です。
簡単に自己紹介します。私の名前は、Kevin Williamsdonです。マイクロソフトのコマーシャル・テクニカル・サポートチームの配下にあるAzure開発者サポートをする為のクラウド・インテグレーション・エンジニアリングチームのエンジニアです。Azureを使用している顧客が遭遇する問題のトラブルシューティングとデバッグを担当しています。AzureのCTP版を提供し始めた日からチームに所属しており、Azure開発コミュニティから学んだことをBlogを使用して共有していきたいと思っています。
一般的によく聞かれる質問の一つが、Azureロールインスタンスを起動し実行するまでの様々なステップに関するAzureロールのアーキテクチャについてです。サービスがデプロイされた時に発生する主要なステップの概要と、Azure VM上で動作しているコアプロセッサーの概要について説明をしてみたいと思います。
プロセッサーの情報
A. RDFE/FEE
RDFE / FFE は、ユーザからファブリックへの通信経路です。
RDFE (RedDog Front End)は、管理ポータルやサービス管理API(例えば、Visual StudioやAzure MMCなど)のフロントエンドとして公開されたAPIです。 ユーザからのすべてのリクエストがRDFEを通ります。
FFE (Fabric Front End) は、RDFEからファブリックコントローラーへ転送するためのレイヤーです。
すべてのリクエストはRDFEからFFEを経由して、ファブリックコントローラーへ到達します。
B. Fabric Controller
Fabric controller は、データセンターのすべてのリソースを監視し、維持する役割を担っています。
ファブリックOS上のファブリック・ホストエージェントと通信し、ゲストOSバージョン、サービスパッケージ、サービス設定、サービス状態のような情報を送信します。
C. Host Agemt
Host Agent は、Host OS上で動作し、ゲストOSのセットアップをします。ロールをgoal状態へ移行させるためにGuest Agent (WaAppAgent) と通信したり、ゲストエージェントでハートビートチェックするためにGuest Agent (WaAppAgent) と通信します。
Host Agenetが10分間ハートビートを受信しなかった場合、Host Agenetは、ゲストOSを再起動させます。
D. WaAppAgent
- ゲストOSのファイヤーウォール、ACLs、ローカルストレージリソース、サービスパッケージ、設定、証明書などを設定します。
- ロールが動作している配下にあるユーザアカウント用のSIDを設定します。
- ファブリックとロール状態を通信します。
- WaHostBootstrapperを開始し、ロールがgoal状態になったことを確認するために監視します。
E. WaHostBootstrapper
- ロール設定を読み込み、すべての必要なタスクと設定プロセスを開始し、ロールを動作せます。
- すべての子プロセスを監視します。
- ロールホストプロセス上で、StatusCheckイベントを伝搬させます。
F. IISConfigurator
IISConfiguratorは、Full IIS Webロールの設定(SDK 1.2 HWCロールは動作しません)がされているときに動作します。
- 標準的なIISサービスを開始します。
- web configで、Rewriteモジュールを設定します。
- サービスモデルで、<Sites>設定でAppPoolを設定します。
- DiagnosticStore LocalStorageフォルダーを指定し、IISロギングを設定します。
- 権限とACLsを設定します。
- ウェブサイトは、e:\sitesroot\0 へコピーし、apppool はIISが動作している場所を指定します。
G. Startup tasks
Startup tasks はロールモデルで定義され、WaHostBootstrapperによって開始されます。
Startup tasksは、非同期でバックグラウンドで動作するように設定でき、host bootstrapperは、Startup taskを開始させ、さらに他のStratup taskを続けて開始させます。
Startup Taskは、シンプルモード(既定)で動作するように設定できます。
シンプルモードは、host bootstrapperが次のstartup taskを続ける前に、startup task の実行が終了し、終了コードSuccess(0)が返ってくるまで処理を待ちます。
H. DiagnosticsAgent/RemoteAccessAgent/RemoteFowarderAgent
これらのタスクは、SDKの一部で、ロールのサービス定義(.csdef)で定義されます。
Startup Taskが始まると、DiagnosticsAgent と RemoteAccessAgent は、/blockStartup パラメータで定義された2つのStartupタスクで同時に1つしか動作しません。標準的なstartup taskは、ロールが実行している間にバックグラウンドで動作できるように、バックグラウンドstartup task で定義されています。
/blockStartup startup taskは終了するまで、WaHostBootstrapperが続きの処理を待ち続けられるようにSimple taskと定義されています。/blockStartupタスクは、初期化を終了するための決められたタスクを待ち、それが終了したら、 host bootstrapperが処理を継続できるようにします。
このように処理をする理由は、ロールプロセスを開始する前(/blockStartupタスクに対して実行します)に、diagnostics とRDPアクセスができるように設定し、host bootstrapperがスタートアップタスク(これは通常のタスクに対して実行します)が終了した後、diagnostics とRDPアクセスは動作を継続します。
I. WaWorkerHost
WaWorkerHost は、通常のWorkerロール用の標準的なホストプロセスです。
このホストプロセスは、ロールのDLL全てとOnStartやRunのようなエントリポイントをホストします。
J. WaWebHost
WaWebHost は、Hostable Web Core (HWC)に準拠したSDK1.2を使用するように設定したときの、Webロール用の通常のホストプロセスです。
サービス定義(.csdef).から<Sites>エレメントを削除することで、HWCモードをロールで有効にすることができます。このモードでは、すべてのサービスのコードとDLLをWaWebHostプロセスから動作させます。IIS (w3wp)は使用されず、IISはWaWebHost.exeの中でホストされるので、IIS ManagerにAppPoolがありません。
K. WaIISHost
WaIISHost は、Full IISを使用するWebロールのロールエントリポイント用のホストプロセスです。
このプロセスは、RoleEntryPointクラスの実行する際に最初に読み込まれるDLL(このDLLはE:\__entrypoint.txtで定義されています)で、このクラス(OnStart、Run、OnStop)からコードを実行します。幾つかのRoleEnviromentイベント(例えば、StatusCheck、Changedなど)は、このプロセスで発生するRoleEntryPointクラスで作成されます。
L. W3WP
W3WP は、ロールがFull IISを使用するように設定されているときに使用される標準的なIISワーカープロセスです。
これは、IISConfiguratorから設定されたAppPool上で動作します。幾つかのRoleEnviromentイベント(例えば、StatusCheck、Changedなど)は、このプロセスで発生するRoleEntryPointクラスで作成されます。
ワークフローのステップ
- 顧客が、.cspkgと.cscfgのアップロードや、ロールの停止処理、設定の変更などのようなリクエストをします。この処理は、Azure管理ポータルもしくは、Visual Studioの配置機能のようなサービス管理APIを使用するツールで処理します。このリクエストは、すべてのサブスクリプションが関連付けられたRDFEに行き、FFEへリクエストを通信します。ワークフローステップの残りは、新しいパッケージの配置やパッケージの開始のプロセスに引き継ぎます。
- FFEは、(アフィニティグループまたは、地理的位置のような顧客のインプットや、マシンに提供されているファブリックからのインプットを元にした)現在のマシンプールを探し、マシンプールでマスターファブリックコントローラーと通信します。
- fabric controller(ファブリックコントローラー)は、CPUコア上で提供されているホスト(又は新しく起動したホスト)を探します。サービスパッケージと設定をホストにコピーし、ファブリックコントローラーは、(DIPs、Ports、ゲストOSなどの設定した)パッケージをデプロイしたホストOS上のホストエージェントと通信します。
- The host agent は、ゲストOSを開始し、ゲストエージェント(WaAppAgent)と通信します。ホストは、ロールがゴール状態に向けて動作していることを確認するために下宇土にハードビートを送信します。
- WaAppAgent は、ゲストOS(ファイヤウオール、ACLs、ローカルストレージなど)を設定し、新しいXML設定ファイルをc:\Configへコピーし、WaHostBootstrapperプロセスを開始します。
- Full IIS Webロールの為に、WaHostBootstrapperは、IISConfiguratorを開始し、IISからWebロール用の既存のAppPoolを削除するよう指示します。
- WaHostBootstrapper は、E:\RoleModel.xmlから<Startup>タスクを読み込み、スタートアップタスクの実行を開始します。 WaHostBootstrapperは、すべてのSimpleスタートアップタスクが終了し、正常終了を返してくるまで待機します。
- Full IIS Webロールの為に、WaHostBootstrapperは、IIS AppPoolを設定するためにIISConfigurator へ指示し、E:\Sitesroot\<index>サイトを提示します。<index>は、サービスを定義する<Sites>エレメントの数字を基にした0です。
- WaHostBootstrapper は、ロールの種類に応じたホストサービスを開始します。
- Worker Role: WaWorkerHost.exe を開始します。WaHostBootstrapperはOnStart()メソッドを実行し、Run()メソッドの実行を開始したことが返ってきたら、同時にロール準備完了をマークし、ロードバランサーの管理に追加します(もしInputEndpointsが定義されている場合は)。WaHostBootsrapperは、ロール状態を巡回確認します。
- SDK 1.2 HWC Web Role: WaWebHost を開始します。WaHostBootstrapperOnStart()メソッドを実行し、Run()メソッドの実行を開始したことが返ってきたら、同時にロール準備完了をマークし、ロードバランサーの管理に追加します。WaWebHostは、準備のためのリクエスト(GET /do.__rd_runtime_init__)を発生させます。 すべてのwebリクエストは、WaWebHost.exeに送信されます。WaHostBootsrapperは、ロール状態を巡回確認します。
- Full IIS Web Role: WaIISHost を開始します。WaHostBootstrapperが、OnStart() メソッドを実行し、 Run()メソッドの実行を開始したことが返ってきたら、同時にロール準備完了をマークし、ロードバランサーの管理に追加します。WaHostBootsrapperは、ロール状態を巡回確認します。
- Full IIS Webロールへのウェブリクエスト要求が来ると、W3WPプロセスを開始するためのトリガーとなり、業務用のIIS環境で動作させた時と同じようにリクエストを処理します。
ログファイルの場所
WaAppAgent
- D:\Packages\GuestAgent\WaAppAgent.exe.log
- D:\Packages\GuestAgent\WaAppAgent.log
WaHostBootstrapper
- C:\Resources\Temp\<guid>.<role>\RoleTemp\WaHostBootstrapper.log
WaWebHost
- C:\Resources\Temp\<guid>.<role>\RoleTemp\WaWebHost.log
WaIISHost
- C:\Resources\Temp\<guid>.<role>\RoleTemp\WaIISHost.log
IISConfigurator
- C:\Resources\Temp\<guid>.<role>\RoleTemp\IISConfigurator.log
IIS Logs
- C:\Resources\Directory\<guid>.<role>.DiagnosticStore\LogFiles\W3SVC1
Windows Event Logs
- D:\Windows\System32\Winevt\Logs