久しぶりに Azure Cloud Services のデプロイでハマってしまったので共有しておきます。
Web Role や Worker Role のプロジェクトをデプロイした際、パッケージに問題があり、ビジー → 再開中 が繰り返されてデプロイが完了しないときがあります。ポータル上では、何かしらのエラーが発生してロールが起動しないことは分かりますが、詳しい原因までは分かりません。
DebugView for Windows というツールでログを取得すると、エラーの詳細が分かることがあります。
使い方
- こちらのサイトから DebugView for Windows をダウンロードします。
- デプロイが完了しないロールのインスタンスにリモートデスクトップ接続して、先ほどダウンロードしたファイルをコピーします。
- ロールのインスタンス上で、DbgView.exe を管理者権限で起動します。
- Capture メニューで、Capture Win32 と Capture Global Win32 にチェックを入れます。
- Options メニューで Clock Time にチェックを入れます。
- ビジー → 再開中 の繰り返しが何度か発生するまで、ログを取得します。
- File メニューで、Save As からログをファイルに保存します。
ログの解析
例えば、次のようなログ出力されている場合、System.Web.HTTP.dll がパッケージに含まれない可能性があります。
#RD000D3A50148A.LOG 00000235 6:22:00 AM [3128] System.TypeLoadException: Unable to load the role entry point due to the following exceptions: 00000236 6:22:00 AM [3128] -- System.IO.FileNotFoundException: Could not load file or assembly 'System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. 00000237 6:22:00 AM [3128] File name: 'System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
このアセンブリを参照設定に追加して、ローカルにコピーするプロパティを True に設定すれば解決です。
また、次のようなログ出力されている場合、Microsoft.WindowsAzure.Storage.dll の古いバージョン(2.1.0.4)を意図せず参照している可能性があります。
#RD000D3A50148A.LOG 00000128 8:15:45 AM [3632] System.IO.FileLoadException: Could not load file or assembly 'Microsoft.WindowsAzure.Storage, Version=2.1.0.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 00000129 8:15:45 AM [3632] File name: 'Microsoft.WindowsAzure.Storage, Version=2.1.0.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
Web.config にリダイレクトの記載を追加すれば解決です。
#Web.config <dependentAssembly> <assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31bf3856ad364e35" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0"/> </dependentAssembly>
まとめ
ビジー → 再開中 が繰り返されてデプロイが完了しない原因は、Web Role や Worker Role のプロジェクトが参照しているアセンブリがパッケージに含まれていなかったり、スタートアップタスク内でエラーが発生していることが考えられます。
ポータル上では詳しい原因までは分かりませんので、DebugView for Windows でログを取得して原因を特定するようにしましょう。