テスターですが何か?

ホビープログラマ略してHPです

LightElectricity on Azure(5) サービスホストへ複数のWebアプリケーションをデプロイする

leave a comment »

前回のエントリーで気づきましたが、Azureプロジェクトをサービスホストへデプロイするとルートへ配置されます。つまり、以下のような構成のAzureプロジェクトをデプロイするとURLは

http://david9142.cloudapp.net/

になり

http://david9142.cloudapp.net/lightelectricity/

にはなりません。

image

つまり、デフォルトでは1つのサービスホストに1つのWebアプリケーション、複数のインスタンスが設定されることになります。つまり複数のWebアプリケーションをAzureへデプロイするためには、複数のサービスホスト・複数のインスタンスが必要になります。つまり、2つ以上のアプリケーションを動かすためにインスタンスには余裕があるのに、複数のインスタンスを作成することになります。そしてアプリケーションを動かしている限り、インスタンスの数だけ料金が発生してしまいます。インスタンスのパワーには余裕があるのに(自分しかアクセスしないので)、複数のインスタンスを使うのは非効率だなぁ、1つのサービスホスト、インスタンスで複数のWebアプリを動かせないものかと調べてみました。

同じWindowsでIIS7/7.5なのでの仮想ディレクトリのように1つのインスタンスに複数のWebアプリをデプロイ出きるはず、と思って調べてみたんですが...分からない、たぶんできないっぽい。Azureのハッシュタグ「#Azurejp」をつけてふらっとつぶやいてみたらAzure MVPの@normalianさんから複数サイト/仮想ディレクトリ構成にできると回答をいただきました。その時に教えていただいたページは以下です。

 

Exercise 1: Registering Sites, Applications, and Virtual Directories

http://msdn.microsoft.com/en-us/wazplatformtrainingcourse_advancedwebandworkerrolesvs2010lab_topic2.aspx

 

上記サイトの手順を参考に1つのサービスホストへ複数のWebアプリケーションを1つのインスタンスで動作させるソリューションを作成します。つまり、LightElectricityをhttp://david9142.cloudapp.net/lightelectricityで動作させます。

まずは新しくAzureプロジェクトを作成します、ルートにデプロイされるアプリケーション(Webロール)は適当に何か選択します。

image

image

ソリューションの状態はこうなります。

image

次に、このソリューションにlightelectricityプロジェクトを追加します。

image

image

ここからが、本題です。このLightElectricityアプリケーション(ルート以外で動作させたいアプリケーション)をロールに直接ソリューションに追加せずに、ルート以外にデプロイされるように設定します。

「ServiceDefinition.csdef」ファイルの内容を変更します。変更前は以下の内容になっているはずです。

<WebRole name="WebRole1">
  <Sites>
    <Site name="Web">
      <Bindings>
        <Binding name="Endpoint1" endpointName="Endpoint1" />
      </Bindings>
    </Site>
  </Sites>
  <Endpoints>
    <InputEndpoint name="Endpoint1" protocol="http" port="80" />
  </Endpoints>
  <Imports>
    <Import moduleName="Diagnostics" />
  </Imports>
</WebRole>

この内容を以下のとおり変更します。

<WebRole name="WebRole1" vmsize="ExtraSmall">
  <Sites>
    <Site name="myweb" physicalDirectory="..\WebRole1">
      <VirtualApplication name="lightelectricity" physicalDirectory="..\..\LightElectricityAzure\LightElectricity">
        <VirtualDirectory name="Scripts" physicalDirectory="..\..\LightElectricityAzure\LightElectricity\Scripts" />
      </VirtualApplication>
      <Bindings>
        <Binding name="Endpoint1" endpointName="Endpoint1" />
      </Bindings>
    </Site>
  </Sites>
  <Endpoints>
    <InputEndpoint name="Endpoint1" protocol="http" port="80" />
  </Endpoints>
  <Imports>
    <Import moduleName="Diagnostics" />
  </Imports>
</WebRole>

ポイントは赤色の部分ですが、解説を書くと以下の通りです。

  • SiteのphysicalDirectoryにロールに設定したプロジェクトのディレクトリを指定します。
  • VirtualApplicationにソリューションに追加した、ルートディレクトリの下でIISの仮想ディレクトリのように動作させたいアプリケーションのディレクトリを指定します。

このソリューションを実行して、/lightelectricity/ディレクトリを指定すると。ルート以外の場所にもアプリケーションが配置されていることを確認できます。この例では1つのアプリケーションしか設定していませんが、複数のアプリケーションをデプロイしたい場合は<VirtualApplication>を複数設定することで対応できるはずです。

image

 

作成したAzureプロジェクトをWindowsAzurePlatformへデプロイするとルート以外の場所に配置できていることが確認できます。URLに注目してください。

image

 

今回のエントリーはここまでです。これ以降はアプリの開発に専念できると思います。

Written by david9142

2011年5月23日 @ 1:19 AM

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。