AzureでIronRubyがホスティング出来ないかと作業中に、 WorkerRoleへ外部から接続する方法について挑戦したので、記録しておく。
外部からWorkerロールへの接続
最近、外部のインターネットから WorkerRole へ通信できるように出来るようになったらしい。 ということで、その方法を試してみる。
設定
ソリューションエクスプローラから、WorkerRoleを選択肢、そのプロパティ画面を開く。
そして、その中の「EndPoints」を選択しそこに外部から接続するポートを指定する。
設定した実際の例は以下のようになる。
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="IronRubyHost" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WorkerRole name="WorkerRole1">
(snip)
<Endpoints>
<InputEndpoint name="IronRubyHttp" protocol="tcp" port="8080" />
</Endpoints>
(snip)
</WorkerRole>
</ServiceDefinition>
今回は、IronRubyポーティング用のプロジェクトを用いて設定していたので、name="IronRubyHttp"としているが、 名前は任意の物を指定できる。
コーディング
次に応答するプログラムを書いてみる。
以下のように書き、実行する。
public override void Run()
{
Trace.WriteLine("WorkerRole1 entry point called", "Information");
var port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["IronRubyHttp"].IPEndpoint.Port;
var listner = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var listen = new IPEndPoint(IPAddress.Any, port);
listner.Bind(listen);
listner.Listen(1);
while (true)
{
try
{
Socket socket = listner.Accept();
var buff = System.Text.Encoding.ASCII.GetBytes("Hello");
socket.Send(buff);
socket.Close();
}
catch (Exception ex )
{
Trace.WriteLine("Exception HttpServerProcess ", "Information");
Trace.WriteLine(ex.ToString(), "Information");
Trace.WriteLine(ex.StackTrace, "Information");
}
Thread.Sleep(10000);
Trace.WriteLine("Working", "Information");
}
}
確認
telnet ソフトから Azureの 8080 ポートへ接続すると、 Hello が表示される。
ポート
注意しておきたいのは、 <InputEndpoint name="IronRubyHttp" protocol="tcp" port="8080" />で指定したポートは 外部インターネットと接続するポート番号であり、各ロールの待ち受け用の番号では ないということである。各ロールで受ける際には、RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["IronRubyHttp"].IPEndpoint.Port のようにして行う。
この点を理解しなかったために、かなり手間取った。
イメージにすると以下のようになる。
おわりに
このようにして外部との接続が可能となり、Tomcatなどを動かす事もできるようである。


コメントする