normalian blog

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

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()は呼ばれていないようなので注意が必要だ。

本番環境での起動

InputEndpointタグのport属性を80番に変更してホスティッドサービス側にデプロイしたところ、無事にアプリケーションの動作が確認できた。