Windows Azure SDK 1.5 の ProgramEntryPoint を利用する
id:waritohutsu:20110917:1316271972 で紹介した Windows Azure SDK 1.5 の新機能の中から、ProgramEntryPoint を利用した WorkerRole から Node.js の起動例を紹介する。前回の記事「 Node.js on Windows Azureを試してみる id:waritohutsu:20110801:1312224615 」で利用したサンプルをベースとして紹介させて頂く。
ServiceDefinition.csdef の編集
サンプルに対して、ProgramEntryPoint を利用するように ServiceDefinition.csdef を編集する。ProgramEntryPoint タグの commandLine 属性に対して、引数を含めた実行ファイルの起動方法を指定する。ProgramEntryPoint タグの詳細については WorkerRole Schema > ProgramEntryPoint Element を確認して頂きたいが、%ROLEROOT%\Approot からの相対パスを指定する。
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="NodeJsAzureProject" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WorkerRole name="WorkerRole1"> <Imports> <Import moduleName="Diagnostics" /> <Import moduleName="RemoteAccess" /> <Import moduleName="RemoteForwarder" /> </Imports> <Endpoints> <InputEndpoint name="HttpIn" protocol="tcp" port="85" localPort="8080" /> </Endpoints> <Runtime> <EntryPoint> <ProgramEntryPoint commandLine="node/node.exe example.js" setReadyOnProcessStart="true" /> </EntryPoint> </Runtime> </WorkerRole> </ServiceDefinition>
ポートを85に変更した点に注意してほしい。また、上記の定義ファイルを指定したWorkerRoleのフォルダ構成は以下になるので参考にして頂きたい。
ローカルでの起動
上記の編集のみでアプリケーションをビルドしたところ、以下の警告が表示された。どうやら WorkerRole.cs で記述したエントリポイントは読み込まれないらしい。
ビルド後にCompute Emulatorでアプリケーションを実行したところ、http://localhost:8080/ にアクセスしても何の応答もない…。不思議に思って http://127.0.0.1:85/ にアクセスしたところ、無事にアプリケーションへの疎通が確認できた。この辺りも含め、Compute Emulatorは大分改善されているらしい。
また、実行時のログ出力を確認したところ、やはりWorkerRole.OnStart()やWorkerRole.Run()は呼ばれていないようなので注意が必要だ。