AMY&PINK

日本のITを世界へ!

Windows Azure Servicesを作る

演習2:コンフィグ設定および、ログとデバッグ。

この演習では、いくつかのWindows Azure APIと開発ファブリックの機能を見て行きます。

まず最初に、ログの追加についてみてみます。ログは、Windows Azure アプリケーションにおいて極めて重要です。これは、あなたのアプリケーションで何が起こっているのかを見えるようにします。ローカルの開発ファブリックに対してはデバッガーをアタッチできますが、クラウドに対してはデバッガーのアタッチができません。Windows Azure ログには、アプリケーションのトラブルを解決する為のイベントを書き出すことができます。また、全てのハンドルされないExceptionもWindows Azureログに記録されます。

以下のタスクでは、ServiceDefinition.csdef ファイルに追加のインスタンスコンフィグレーションの定義を追加します。このコンフィグレーションは、Windows Azure APIを使ってランタイムから読むことができます。インスタンスコンフィグレーションはWebサイトとワーカープロセスによって読まれます。インスタンスコンフィグレーションは、ランタイムで変更することが出来ます。

※ノート
.cscfg ファイルに含まれる ConfigurationSettingsエレメントの全ての子エレメントは、.csdef ファイルに対応するエレメントが存在している必要があります。

それから、ローカルストレージとしてメッセージを保存するためにファイルを使うように設定することが出来ます。そのローカルストレージは、インスタンス間では共有されません。

ServiceDefinition.csdefファイルは、インスタンスの用件も含んでいます。以下のタスクでは、ローカルファブリックで実行中のインスタンスの数を変更します。

Task 1 - ログサポートの追加

このタスクでは、いくつかの基本的なログサポートを追加します。

  1. Exercise1で作成したプロジェクトか、C:AzureServicesKitLabsBuildingWindowsAzureServicesEx02-Configurationbegin に含まれるbegin.sln ファイルを開きます。
    ※ノート
    もし、Visual Studio を閉じた場合、Administrator として実行するように注意してください。
  2. Default.aspx ページに、ツールバーから新しい ASP:Button コントロールを divタグの後の先ほど追加したテキストの後に追加します。
  3. ボタンのIDを btnLog に変更して、Text プロパティに “Log This” をセットします。
  4. 新しい ASP:Button を追加してIDにbtnThrowException をセットし、Text プロパティに “Throw Exception” をセットします。
  5. 新しい ASP:TextBox を追加したボタンの前に追加します。ASP:TextBox のIDを txtMessage に変更します。ここで、良い感じに見えるようにレイアウトすることも出来ますが、それは必須ではありません。
  6. 更新したページは、以下に似たようになっているはずです。”runat” 属性が含まれます。
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="RDCompute_WebRole._Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Hello Windows Azure</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        Welcome to the world of Cloud Computing
        <br />
        <asp:TextBox ID="txtMessage" runat="server"></asp:TextBox>
        <asp:Button ID="btnLog" runat="server" Text="Log This" />
        <asp:Button ID="btnThrowException" runat="server" Text="Throw Exception" />
        </div>
        </form>
    </body>
    </html>
  7. Default.aspx をデザインモードで開いて、”Log This” ボタンをダブルクリックします。そして、以下の処理を btnLog_Click イベントに追加します。
    ※ノート
    入力を減らす為に、コードを挿入したい箇所を右クリックして「スニペットの挿入」を選択して、「My Code Snippets」を選択し、現在の練習ステップに適したエントリーを選択します。

    001-snippet

  8. (コードスニペットは、「Building Windows Azure Service Lab - Ex02 Log Message)

    protected void btnLog_Click(object sender, EventArgs e)
    {
        RoleManager.WriteToLog("Information", txtMessage.Text);
    }

  9. Default.aspx をデザインモードで開いて、”Throw Exception” ボタンをダブルクリックします。そして、以下の処理を btnThrowException_Click イベントに追加します。
    (Code Snippet – Building Windows Azure Services Lab - Ex02 Throw Exception)

    protected void btnThrowException_Click(object sender, EventArgs e)
    {
        try
        {
            object o = null;
            o.ToString();
        }
        catch (Exception ex)
        {
            RoleManager.WriteToLog("Error", ex.ToString());
        }
    }
  10. F5 キーを押して、サービスを実行します。
  11. Internet Explorer にスイッチして、テキストボックスに”Windows Azure Rocks” と入力して”Log This” ボタンをクリックします。
  12. ”Throw Exception”ボタンをクリックします。
  13. 開発ファブリックに戻ってみます。もし、開発ファブリックが表示されていない場合、タスクバーのアイコンを右クリックして”Show Development Fabric UI”を選択します。
    ログメッセージを見ることが出来ます。

    002-showlog

  14. デバッグを停止するには、Visual Studio でShift + F5 を 押します。

Task 2 - 開発ファブリックでのデバッグ

このタスクでは、Visual Studioを使ってアプリケーションをデバッグするために、開発ファブリックにアタッチしてみます。

  1. Default.aspx ファイルを開き、btnThrowException_Click メソッドの最初にブレークポイントをセットします。
  2. F5キーを押してデバッグを開始します。
    ※ノート
    このポイントは、Visual Studioデバッガーは、開発ファブリックにアタッチされ、通常のASP.NETアプリケーションと同じようにデバッグが出来るという点です。
  3. 次に、テナントを停止しましょう。こうします。 開発ファブリックでテナントノード(deployment(xx))を選択して、Suspend ボタンをクリックします。
  4. すると、テナントは停止するので、Runボタンをクリックして再開させます。
  5. Webブラウザーに戻って、”Throw Exception”ボタンをクリックします。default.aspx.cs ページはVisual Studioでロードされて、ブレークポイントで実行を停止します。
    ※ノート
    デバッガーは、テナントがサスペンドしたにもかかわらず残っている点に注目してください。
  6. F5キーを押して、処理を続けます。
  7. Visual Studioに戻って、Shift+F5 キーを押してデバッグを停止します。

Task 3 - インスタンスのコンフィグレーションを使う

このタスクでは、アプリケーションの為にコンフィグレーションを追加し、Windows Azure APIを使って読み出してみます。ServiceDefinition.csdef ファイル内に Settings が定義されています。 settingsの値は、ServiceConfiguration.cscfg ファイルに定義されています。

  1. RDCompute プロジェクトのServiceDefinition.csdef ファイルを開きます。
  2. “GreetingString” という名前の新しいsetting を、以下のようにWebRoleに追加します。
    <?xml version="1.0" encoding="utf-8"?>
    <ServiceDefinition name="RDCompute" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
      <WebRole name="WebRole">
        <ConfigurationSettings>
          <Setting name="GreetingString"/>
        </ConfigurationSettings>
        <InputEndpoints>
          <InputEndpoint name="HttpIn" protocol="http" port="80" />
        </InputEndpoints>
      </WebRole>
    </ServiceDefinition>
  3. RDCompute プロジェクトの ServiceConfiguration.cscfg ファイルを開きます。
  4. WebRoleのRoleタグに、GreetingString setting を追加して、値に "Hi Windows Azure" を以下のように追加します。
    
    <?xml version="1.0"?>
    <ServiceConfiguration serviceName="RDCompute" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
      <Role name="WebRole">
        <Instances count="1"/>
        <ConfigurationSettings>
          <Setting name="GreetingString" value="Hi Windows Azure"/>
        </ConfigurationSettings>
      </Role>
    </ServiceConfiguration>

  5. Default.aspx.cs ファイルを開きます。
  6. Page_Load メソッドに、以下のコードを追加します。
    (Code Snippet – Building Windows Azure Services Lab - Ex02 Set title)
    
    this.Title = RoleManager.GetConfigurationSetting("GreetingString");
    

  7. F5キーを押して、サービスを実行します。
  8. IEのタイトルバーに、"Hi Windows Azure"というメッセージがコンフィグレーションから取得されて表示されていることに注目してください。
    
    003-getconfiguration
  9. Visual Studioに戻って、SHIFT+F5 キーを押してデバッグを終了します。

Task 4 - ローカルストレージを使う

このタスクでは、メッセージをテキストファイルに保存するための名前付きのローカルストレージリソースを構成します。

  1. “RDComputeStorage”という名前のローカルストレージリソースを定義します。 この為に、ServiceDefinition.csdef ファイルを開いて、WebRoleに LocalStorage エレメントを追加して、name 属性に RDCOmputeStorage を以下のようにセットします。
    <?xml version="1.0" encoding="utf-8"?>
    <ServiceDefinition name="RDCompute" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
      <WebRole name="WebRole">
        <LocalStorage name="RDComputeStorage"/>
        <ConfigurationSettings>
          <Setting name="GreetingString"/>
        </ConfigurationSettings>
        <InputEndpoints>
          <InputEndpoint name="HttpIn" protocol="http" port="80" />
        </InputEndpoints>
      </WebRole>
    </ServiceDefinition>
  2. Shoutbox.aspx ページと MessageHelper クラスを追加します。 ソリューションエクスプローラーで RDCompute_WebRoleProject を 右クリックして、「追加」→「既存の項目」を選択します。「既存の項目の追加」ダイアログで、「C:\AzureServicesKit\Labs\BuildingWindowsAzureServices\Assets」 を開いて、MessageHelper.cs, Shoutbox.aspx, Shoutbox.aspx.cs, Shoutbox.aspx.designer.cs ファイルを選択して、追加をクリックします。
  3. MessageHelper.cs ファイルを開きます。
  4. GetFilePath メソッドの実装を、以下のコードに置き換えます。
    (Code Snippet – Building Windows Azure Services Lab - Ex02 GetFilePath)

    public static string GetFilePath()
    {
       ILocalResource resource = RoleManager.GetLocalResource("RDComputeStorage");
       string path = Path.Combine(resource.RootPath, "messages.txt");
       return path;
    }
  5. ソリューションエクスプローラーの Shoutbox.aspx ファイルを右クリックして、「スタートページに設定」をクリックします。
  6. F5キーを押して、デバッグを開始します。
  7. メッセージを入力して、Send ボタンを押します。
    .
    .004-shoutbox.
    .
    ※ノート
    ローカルストレージリソースは、テナント間で共有されない物理ファイルです。従って、ローカルストレージはリクエスト間の情報保存の為に使うべきではありません。個々のリクエストは、異なるテナントで処理される可能性があり、そのため、ローカルストレージの場所も異なります。
  8. Visual Studioに戻って、SHIFT+F5を押してデバッグを終了します。

Task 5 - 開発ファブリックで複数インスタンスの実行

このタスクでは、ファブリックで実行したいインスタンスの数だけ追加するように、コンフィグレーションを編集します。これによって、クラウド環境を想定したアプリケーションのマルチインスタンス環境でのテストを行うことが出来ます。

  1. ターゲットのインスタンス数を2にセットします。ServiceConfiguration.cscfg ファイルを開き、Instance エレメントのcount 属性の値を2にセットします。

    <?xml version="1.0"?>
    <ServiceConfiguration serviceName="RDCompute" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
      <Role name="WebRole">
        <Instances count="2"/>
        <ConfigurationSettings>
          <Setting name="GreetingString" value="Hi Windows Azure"/>
        </ConfigurationSettings>
      </Role>
    </ServiceConfiguration>

    ※ノート
    count 属性 は、必要としているロールインスタンスの数を示しています。

  2. F5キーを押します。開発ファブリックが2つのインスタンスが実行された状態でロードされます。

    .005-fablicui.

  3. ブラウザの新しいインスタンス(新しいタブではなく)を起動し、http://127.0.0.1:81/shoutbox.aspx を開きます。(必要に応じてポート番号を指定してください)

    ※私がやった場合には、ポートは5100 番でした。netstat コマンドで、利用しているポート番号を見ることが出来るようです。(By 百蔵。)

  4. 幾つかのメッセージをそれぞれのブラウザのウィンドウに入力します。リクエストが、一つまたは、別のインスタンスで処理されるのを見ることが出来ます。
  5. Visual Studio に戻って、SHIFT+F5 キーを押してデバッグを停止します。
  6. 実行するインスタンス数を1に戻します。Step1の手順に従って、count 属性の値を 1 に戻します。