normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Windows Azure Drives with Full IIS in SDK 1.3の翻訳

とても重要な情報だったので、 Windows Azure Drives with Full IIS in SDK 1.3 について翻訳してみました。問題、間違い等が有ればご一報頂ければ幸いです。

以下は記事の内容です。

Windows Azure SDK 1.3では、WebロールをFull IISで実行することが可能になりました。Full IISについて良く分かっていない方は、Full IISとHosted Web Core(HWC) (SDK 1.2以前で唯一の実行モード)の違いについて述べている こちらのブログ を参照してください。さらに、storage configuration setting publisherへの影響について分かりやすく記載している こちらのブログ もオススメです。本記事は、これらの記事で述べているもの以外について紹介します。

Global.asaxファイルで Driveの初期化を実行

Full IISでは、OnStart()メソッドは Webロールの Page_Load()メソッドとは異なるプロセスで実行されます。そのため、OnStart()メソッドでグローバル変数として保存されるドライブレターは、Page_Load()メソッドでは利用できません。この問題に対応するには、すべてのドライブに対する処理(キャッシュ、生成、マウント)を、Global.asaxのApplication_Start()メソッドで実行する方法がオススメです。この方法は、Hosted Web Coreでも利用できます。

.NET 4.0での懸念

.NET 4.0では既知の問題が存在し、Application_Start()メソッド内でStorage Client APIの呼出(Blob、Table、Queue)が失敗する原因となります。.NET 4.0では、この場合に発生する例外は「 HttpException (0x80004005): Response is not available in this context” from Global.ApplicationStart” on .NET 4.0. 」です。
この問題は.NET 4.0のサービスパックで対応される予定です。サービスパックがでるまで、この問題に対処する唯一の方法は、Blob,Table,Queueの操作を別メソッド(OnStart()やGlobal.asaxの別メソッド)に移動させることです。OnStart()メソッドは、常にApplication_Start()メソッドより前に呼び出される点に留意してください。
もう一つの方法として、.NET 4.0のサービスパックが出るまで、WebロールをHosted Web Coreで実行する方法です。ServiceDefinition.csdefファイルの要素をコメントアウトするだけで、Full IISを無効にすることが出来ます。

Full IISを利用した場合、Storage EmulatorではDriveがユーザコンテキストを跨いで有効にならない

開発環境では、ドライブをマウントしたユーザコンテキストは別のユーザコンテキストから参照できません(OnStart()メソッドとApplication_Start()メソッドは同一のユーザコンテキストで実行されない)。ドライブがOnStart()メソッドでマウントされた場合、ドライブレターはプロセス間通信によりIISプロセスに渡されるため、開発環境で実行された場合にIISプロセスでシミュレートされたドライブを参照できません。
クラウド上で実行した場合、マウントされたドライブはロール全体で参照可能です。IIS HWCではPage_Load()メソッドとOnStart()メソッドは常に同一のプロセスで実行されるため、この問題は発生しません。

Full IISとSDK1.3を利用した場合、Storage Emulatorで発生する問題の回避策

Full IISSDK 1.3を利用した場合に問題となる点について、本節で紹介します。これらの問題はIIS Hosted Web Coreを利用した場合は発生しない点に注意してください。

  1. Windows Azure Emulatorで実行した場合、Application_Start()メソッドでCloudDrive.InitializeCache()を実行した場合にERROR_UNSUPPORTED_OS が返される
    • この問題に対応するには、あなたの端末の適切なディレクトリにAZURE_DRIVE_DEV_PATHを環境変数として設定する必要があります。
    • 環境変数にAZURE_DRIVE_DEV_PATHを設定する方法は、"マイコンピュータ"を右クリックしてプロパティを選択し、"システムの詳細設定"を選択してダイアログを表示します。"環境変数"からAZURE_DRIVE_DEV_PATHという名前の変数を追加し、値に端末のディレクトリ(c:\AzureDriveDevPath等)を設定します。同パスは自分で作成し、すべてのプロセスからアクセスできる必要があります。この値を適切なプロセスに渡すためには、マシンを再起動する必要があります。
  2. x86(x64でなく)でWindows Azure Emulatorを実行する場合、“Could not load file or assembly ‘mswacdmi.dll’ or one of its dependencies.”のエラーが発生する。
    • 回避策は、「C:\Program Files\Windows Azure SDK\v1.3\bin\runtimes\storage\simulation\x86」を環境変数のパスに追加することです。パスの追加後、マシンを再起動してください。
  3. Full IISWindows Azure Emulatorを実行してCloudDrive.Snapshot()メソッドを呼んだ場合、‘Unknown Error HRESULT=800040005’エラーが発生します。
    • この問題は、Storage Emulatorが"バックアップ"のセマンティクス下でスナップショットを作成する場合に発生する。Full IISは"NETWORK_SERVICE"ユーザで実行されるため、"バックアップ"権限を保持していない。
    • この問題への対応は、"NETWORK_SERVICE"を"Backup Operators"グループに追加することです。同処理を行うには、マイコンピュータを右クリックし、"管理"を選択します。"ローカルユーザとグループ"を選択し、グループを選択し、"Backup Operators"をダブルクリックしてください。"追加"ボタンを押下し、"場所"ボタンを押下し、自分のマシンを選択してください。"NETWORK SERVICE"とタイプして"OK"ボタンを押下してください。本問題に対応する必要がない場合、"Backup Operators"から"NETWORK SERVICE"を削除してください。