しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Microsoft Azure Web サイトでスケールアウト時に接続するインスタンスを切り替える

Azure Web サイトは ARRAffinity クッキーの値を見て、接続先のインスタンスを決めていることは既に知っている人も多いと思います。No.1 のブログでも書かれていますしね。

Azure Webサイトで特定インスタンスに接続する « ブチザッキ

基本的に元記事は WebJobs の時に特定のインスタンスへ接続したいという感じだったのですが、個人的にはブラウザからアクセスした時に特定のインスタンスへ接続したいです。

今日、仕事中に Management Library for Web サイトを見ていると GetInstanceIds という現在稼働中のインスタンス ID を取得する API が追加されていたので、実際に Web アプリケーションとして実装してインスタンスを切り替えてみました。

こんな感じのアプリです。

f:id:shiba-yan:20140517000628p:plain

稼働中のインスタンス ID が一覧表示されるので、切り替えたい場合には右にあるボタンをクリックすると接続が切り替わります。

f:id:shiba-yan:20140517002013p:plain

機能としてはたったこれだけの、非常にシンプルなアプリケーションです。

仕組みはほぼ想像ついてると思いますが、稼働中のインスタンス ID の一覧を取得して表示し、選択されたら ARRAffinity クッキーの値として設定しているだけです。Site Extensions としてリリースしたいのですが、そのままでは Management REST API を叩くのが難しいので方法を考えなくては。

今回は気合いで 10 インスタンス立ててみました。利用可能額がガンガン減っていくぜ!

f:id:shiba-yan:20140517000554p:plain

とまあ、アプリの説明はこれぐらいにして Management REST API について少しだけ補足を、と言っても GetInstanceIds というメソッドが増えているので、それを叩くだけです。

var subscriptionId = "SUBSCRIPTION_ID";
var base64Certificate = "BASE64_CERTIFICATE";

var credentials = new CertificateCloudCredentials(subscriptionId, new X509Certificate2(Convert.FromBase64String(base64Certificate)));

var client = new WebSiteManagementClient(credentials);

// 稼働中のインスタンス ID を取得する
var response = client.WebSites.GetInstanceIds("WEBSPACE", "SITENAME");

foreach (var instanceId in response.InstanceIds)
{
    Console.WriteLine(instanceId);
}

こんな感じのコードを書くと、指定した Web サイトで稼働しているインスタンス ID をすべて取得できます。

f:id:shiba-yan:20140517000841p:plain

多少反映されるまでにラグがある気がするので、オートスケールの時は注意が必要な気がします。