あれとアレは混ぜるな危険

日々精進をしているふり

わんくま同盟 東京勉強会#46 フォローアップ その3

こんにちは、はるたまです。呑みてぇなぁ〜。
わんくまのフォローアップも長いもんで3回目です。セッションは50分だったのに、やたらフォローが多いですね。充実のホスピタリティーですね。
今回はWorker RoleでWebサーバーを作る話です。

基本編

わんくま本編でも説明しましたが、2009年11月にWorker Roleに対してInput Endpointが設定できるようになりました。要はインターネットからの接続を受け付けるためのポートを開けることが可能になったわけです。これを使って、超簡単なWebサーバーをC#だけで構築するという記事がここにあります。
Tech Fielders コラム | マイクロソフト
基本的なやり方に関しては、こちらを参照していただいた方がいいかと思います。

応用編

Windows Azureで動作するWebサーバーを構築したということは、任意のファイルを配信できるようにしてみたくなるのが人情というものです。ただし、ローカルで動作するWebサーバーと違って、おいそれとファイルシステムにアクセスできないのがクラウドの悩ましいところです。
これを解決するために、ファイルシステムの代わりとしてWindows AzureのBlobストレージを使用し、ここに置かれたファイルをWebサーバーから配信するように作りこんだのが、わんくまのセッションでお見せしたWebサーバーになります。当日使用したWebサーバーのソースは以下のリンクから入手できます。
webserver.zip
Visual Studio 2010で作られていますので気をつけてください。

使い方

このWebサーバーをVisual Studioから実行すると、Development Fablic上で実行が開始されます。とりあえず、ブラウザから「http://localhost:8080」を叩くと以下のような画面が表示されます。
f:id:haru-tama:20100511001328p:image:w300
実はDevelopment StorageのBlobストレージに置かれたファイル一覧を表示しているのですが、表示するファイルがないので特に何も出てこないですね。
ここで何らかのツールを使用して、Development Storageを開きます。ちなみに今回はCloud Storage Studioというツールを使って開いています。
f:id:haru-tama:20100511001709j:image:w300
すると、Blobストレージに「webserverstorage」という名前のコンテナが作成されていますので、ここに何らかのファイルを置きます。とりあえず画像ファイルなんかを置いておくと分かりやすいかと思います。
ファイルをアップロードしたあとに、Webサーバーにアクセスしているブラウザをリロードすると、先程アップロードしたファイルが一覧として表示されるはずです。
f:id:haru-tama:20100511002406p:image:w300
ここで表示されているリンクをクリックすると、ブラウザでファイルの内容が表示されるはずです。ちなみに今回提供している実装では、Blobに設定されたContent Typeがそのままレスポンスヘッダに設定されるようになっています。

おまけ

Worker Roleで直接動作するWebサーバーが構築できたということは、Worker Role上で何らかの処理を行った結果を、今回動かしているWebサーバーからHTMLとして簡単に見ることが可能になります。
その一例として、「environment config is Here」というリンクをクリックすると、Worker Roleが動いているインスタンス上からSystem.Environmentクラスを使用して取得した各種の情報を参照することができるよう作られています。
f:id:haru-tama:20100511003227p:image:w300
ローカルで実行しても面白くはないのですが、AzureのHosting環境にデプロイすると、Worker Roleが動作しているWindows Azureのマシン環境に関する詳細な情報が見えてしまいます。これを使用すれば「おー今AMDのCPUで動いてるなー」とか「あ、こっちの環境はAドライブが無いなぁ」などの情報が分かってなかなか楽しいです。このアプリケーションをデプロイする場所(USとかEuropeとか)を変えてみたり、一旦消してからまたデプロイすると、表示される内容が変わりますので、ちょっと試してみてください。

誤解の無いよう注意

今回はわざわざ自分で作ったWebサーバーからBlobストレージに置かれたファイルを配信しましたが、本来はこんなことしなくてもBlobストレージのファイルを取得することができます。Azureの本番環境にあるBlobストレージからファイルを取得する際のURLの形式は
http://アカウント名. blob.core.windows.net/コンテナ名/ファイル名
こんな感じになってます。こんなURLをブラウザから叩けばファイルが返ってきますので誤解の無いようお願いします。