特集:事例で学ぶWindows Azure実用ポイント

業務システムでWindows Azureを使うための42の覚え書き

シグマコンサルティング 橋本 圭一
2010/02/23
Page1 Page2 Page3 Page4

ログなどの環境依存の機能

◇11:採取可能なログと格納先

 Windows Azureでは、ログはストレージ(テーブルやブロブ)に格納される。

 テーブルに格納可能なログとしては、以下のものが挙げられる。

a)Windows Azureトレース・ログ(トレース出力の内容は独自に記述)
b)Windows診断インフラストラクチャ・ログ
c)Windowsイベント・ログ
d)パフォーマンス・カウンタ

 ブロブに格納可能なログとしては、以下のものが挙げられる。

e)IIS 7.0ログ
f)IIS 7.0失敗した要求のトレース・ログ
g)Windows Azureクラッシュ・ダンプ

 a)b)c)e)f)のログ出力方法は、後述の「◇12:ログの出力方法」で説明する。それ以外のログ出力方法は、下記の資料を参考にしてほしい。

◇12:ログの出力方法

 クラウド・サービスのプロジェクトをVisual Studioで生成しただけでは、ログは出力されるようにはならない。下記のような手順で、ログ出力の処理を実装する必要がある。

(1)参照設定の追加

 Microsoft.WindowsAzure.Diagnosticsアセンブリへの参照を追加する。

(2)各種ログの転送設定・出力設定の記述

 各ロール内のWebRole.cs/WebRole.vbやWorkerRole.cs/WorkerRole.vbに、各種ログの転送設定などを追記する。下記のコードでは、「a)Windows Azureトレース・ログ」「b)Windows診断インフラストラクチャ・ログ」「c)Windowsイベント・ログ」「e)IIS 7.0ログ」の出力設定を行っている。

 なお、Visual Studioのクラウド・サービスのプロジェクト・テンプレートで生成されるひな型のソース・コードには、一見すると「DiagnoticMonitar.Start」のような記述があり、ログ出力が開始されているようにも見えるが、各種ログをストレージに転送する処理が作成されていないので、例えば下記のような追記が必要だ。

using System.Linq;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;

public class WebRole : RoleEntryPoint
{
  public override bool OnStart()
  {
    // ログ出力や診断情報を監視する構成を取得する
    DiagnosticMonitorConfiguration config =
      DiagnosticMonitor.GetDefaultInitialConfiguration();

    // a)Windows Azureトレース・ログを1分単位で転送する
    config.Logs.ScheduledTransferPeriod =
      System.TimeSpan.FromMinutes(1);

    // b)Windows診断インフラストラクチャ・ログを分単位で転送する
    config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod =
      System.TimeSpan.FromMinutes(1);
    // ログ出力レベルを「警告」に設定する
    config.DiagnosticInfrastructureLogs.
      ScheduledTransferLogLevelFilter = LogLevel.Warning;

    // c)Windowsイベント・ログを1分単位で転送する
    config.WindowsEventLog.DataSources.Add("System!*");
    config.WindowsEventLog.ScheduledTransferPeriod =
      System.TimeSpan.FromMinutes(1);

    // e)IIS 7.0ログを1分単位で転送する
    config.Directories.ScheduledTransferPeriod =
      System.TimeSpan.FromMinutes(1);

    // Windows Azureの診断モニタ(=ログ出力)を開始する
    DiagnosticMonitor.Start(
      "DiagnosticsConnectionString", config);

    // 構成設定の変更イベントをハンドリングする
    RoleEnvironment.Changing += RoleEnvironmentChanging;

    return base.OnStart();
  }

  private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
  {
    // 構成設定が変更されたら、ロール・インスタンスを再起動する
    if (e.Changes.Any(change =>
        change is RoleEnvironmentConfigurationSettingChange))
    {
      e.Cancel = true;
    }
  }
}
Imports Microsoft.WindowsAzure.Diagnostics
Imports Microsoft.WindowsAzure.ServiceRuntime

Public Class WebRole
  Inherits RoleEntryPoint

  Public Overrides Function OnStart() As Boolean

    ' ログ出力や診断情報を監視する構成を取得する
    Dim config As DiagnosticMonitorConfiguration = _
      DiagnosticMonitor.GetDefaultInitialConfiguration()

    ' a)Windows Azureトレース・ログを1分単位で転送する
    config.Logs.ScheduledTransferPeriod = _
      System.TimeSpan.FromMinutes(1)

    ' b)Windows診断インフラストラクチャ・ログを分単位で転送する
    config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod _
      = System.TimeSpan.FromMinutes(1)
    ' ログ出力レベルを「警告」に設定する
    config.DiagnosticInfrastructureLogs. _
      ScheduledTransferLogLevelFilter = LogLevel.Warning

    ' c)Windowsイベント・ログを1分単位で転送する
    config.WindowsEventLog.DataSources.Add("System!*")
    config.WindowsEventLog.ScheduledTransferPeriod = _
      System.TimeSpan.FromMinutes(1)

    ' e)IIS 7.0ログを1分単位で転送する
    config.Directories.ScheduledTransferPeriod = _
      System.TimeSpan.FromMinutes(1)

    ' Windows Azureの診断モニタ(=ログ出力)を開始する
    DiagnosticMonitor.Start( _
      "DiagnosticsConnectionString", config)

    ' 構成設定の変更イベントをハンドリングする
    AddHandler RoleEnvironment.Changing, _
      AddressOf RoleEnvironmentChanging

    Return MyBase.OnStart()

  End Function

  Private Sub RoleEnvironmentChanging(ByVal sender As Object, ByVal e As RoleEnvironmentChangingEventArgs)

    ' 構成設定が変更されたら、ロール・インスタンスを再起動する
    If (e.Changes.Any(Function(change) TypeOf change Is RoleEnvironmentConfigurationSettingChange)) Then
      e.Cancel = True
    End If

  End Sub

End Class
各種ログ出力を有効化するためのサンプル・コード(上:C#、下:VB)
このコードでは、「a)Windows Azureトレース・ログ」「b)Windows診断インフラストラクチャ・ログ」「c)Windowsイベント・ログ」「e)IIS 7.0ログ」が出力されるようにしている。

 DiagnosticMonitor.Startメソッドの引数として指定している「DiagnosticsConnectionString」は、ログ出力先であるストレージへ接続するための接続文字列の設定(=キー名)である。この接続文字列の内容(=キー名に対する値)は、[ソリューション エクスプローラ]のクラウド・サービスのプロジェクト内にある、「Roles」フォルダの各ロールを右クリックし、表示されるコンテキスト・メニューから[プロパティ]を選択して各ロールのプロパティ・ページを開き、その[Settings](設定)タブで変更できる。

(3)「a)Windows Azureトレース・ログ」の出力設定

 Web.configファイルの<configuration>要素内に、下記のような記述でトレース・リスナー設定(=<system.diagnostics>−<trace>−<listeners>要素)を追加する。

<system.diagnostics>
  <trace>
    <listeners>
      <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
        <filter type="" />
      </add>
    </listeners>
  </trace>
</system.diagnostics>
a)Windows Azureトレース・ログのリスナー設定

(4)「f)IIS 7.0失敗した要求のトレース・ログ」の出力設定

 Web.configファイルの<system.webServer>要素内に、下記のような記述で、IIS 7.0の失敗した要求のトレース・ログの出力設定(=<tracing>−<traceFailedRequests>要素)を追加する。

<tracing>
  <traceFailedRequests>
    <add path="*">
      <traceAreas>
        <add provider="ASP" verbosity="Verbose" />
        <add provider="ASPNET"
             areas="Infrastructure,Module,Page,AppServices"
             verbosity="Verbose" />
        <add provider="ISAPI Extension" verbosity="Verbose" />
        <add provider="WWW Server"
             areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module"
             verbosity="Verbose" />
      </traceAreas>
      <failureDefinitions timeTaken="00:00:15" statusCodes="400-599" />
    </add>
  </traceFailedRequests>
</tracing>
f)IIS 7.0失敗した要求のトレース・ログの出力設定

(5)「a)Windows Azureトレース・ログ」の出力内容の記述

 開発者が独自にトレース・ログを出力するには、例えば下記のようなコードを記述すればよい。

System.Diagnostics.Trace.TraceError("システムエラーメッセージ");
System.Diagnostics.Trace.TraceWarning("警告メッセージ");
System.Diagnostics.Trace.TraceInformation("インフォメーション");
System.Diagnostics.Trace.WriteLine("トレース情報です。");
a)Windows Azureトレース・ログを出力するための記述

◇13:ログの確認ツール

 Windows Azureのログは基本的にストレージに格納されるので、ログを参照するにはストレージの内容を閲覧するツールなどが必要だ。ちなみに、筆者が利用しているWindows Azureストレージ管理ツール「Cloud Storage Studio」を使うと、下の画面のようにログの確認を行える。

Windows Azureストレージ管理ツールを用いたログの確認

◇14:Windows Azureトレース・ログの閲覧

 Windows Azureトレース・ログは、テーブル・ストレージの「WASLogsTable」テーブルに格納される。次の画面は、その内容を閲覧しているところだ。

Windows Azureトレース・ログの閲覧(Cloud Storage Studio)の例

◇15:IIS 7.0のログの閲覧

 IIS 7.0ログやIIS 7.0失敗した要求のトレース・ログは、ブロブ・ストレージに格納される。次の画面は、IIS 7.0ログの内容(=「wad-iis-logfiles」コンテナ)を閲覧しているところだ。

Windows Azureトレース・ログの閲覧(Cloud Storage Studio)の例

 また次の画面は、失敗した要求のトレース・ログの内容(=「wad-iis-failedreqlogfiles」コンテナ)を閲覧しているところだ。

Windows Azureトレース・ログの閲覧(Cloud Storage Studio)の例

◇16:サーバサイドの例外の確認

 開発時は、下記のコード例のように、Web.configファイルの<customErrors>要素のmode属性を「Off」に設定してASP.NETアプリのカスタム・エラーを無効にする(=標準の詳細なエラー・メッセージが表示されるようにする)。こうすることで、サーバサイドで発生した例外を参照すると、問題の対処がしやすい(もちろん、本番時はエラー・メッセージを見せないことが望ましい)。

<customErrors mode="Off" />
<customErrors>要素のmode属性を「Off」に設定する例(Web.config)

◇17:セッション管理

 Webロール・インスタンスが複数ある場合、セッション情報はインスタンス間で共有されない。そのため、インスタンス外部にセッション情報を格納する必要がある。これを実現するために、下記のリンク先の「Additional C# Samples」(C#のみ)に含まれる「AspProviders」というサンプル・ライブラリでは、ストレージ(テーブルとブロブ)にセッション情報を格納する機能が提供されている。

 [ソリューション エクスプローラ]でAspProvidersのライブラリへの参照を設定し、カスタムのセッション状態プロバイダの構成設定をWeb.configファイルに記述することで、Sessionオブジェクトの内容がストレージに格納されるようになる。下記のコードは、その構成設定の例である。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <system.web>
    <!-- カスタム・セッション状態プロバイダの構成設定 -->
    <sessionState mode="Custom" customProvider="TableStorageSessionStateProvider">
      <providers>
        <clear />
        <add
  name="TableStorageSessionStateProvider"
  type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider"
  applicationName="CloudServiceName"
  accountName="devstoreaccount1"
  sharedKey="Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
  tableServiceBaseUri="http://127.0.0.1:10002/devstoreaccount1"
  sessionTableName="Sessions"
  blobServiceBaseUri="http://127.0.0.1:10000/devstoreaccount1"
  containerName="sessionprovidercontainer"
         />
      </providers>
    </sessionState>
  ……省略……
  </system.web>

  ……省略……
</configuration>
カスタムのセッション状態プロバイダの構成設定(Web.config)
<add>要素の各属性は英語表記名を見れば、だいたい想像が付くだろう。applicationName属性の値は、テーブルのパーティションを決めるPartitionKeyプロパティの一部として使われる。

 後は通常どおりSessionオブジェクトを利用すればよい。Sessionオブジェクトの利用方法については「連載:プログラミングASP.NET 第15回 セッションとビューステート」を参照してほしい。

◇18:リモート管理

 提供するクラウド・サービスを夜間のみ停止させるなどの目的で、Windows Azureクラウド・サービスのデプロイ・実行・停止・削除、そのほかの管理作業をリモート管理したい場合がある。これを行う際には、Windows Azure Service Management APIを利用する必要があるが、このAPIをラップしたPowerShell Cmdlet(コマンドレット:PowerShell用のコマンド)として「Windows Azure Service Management CmdLets」(以降、Management CmdLets)が提供されているので、こちらを使う方が手軽である。

 下記のコードは、Management CmdLetsでアプリを停止するサンプル・スクリプトである。

$servicename = '<サービス名>'
$sub = "<サブスクリプションID>"
$cert= Get-Item cert:\CurrentUser\Root\<証明書の母印>

Get-HostedService $servicename -Certificate $cert -SubscriptionId $sub |
  Get-Deployment -Slot Production |
  Set-DeploymentStatus 'Suspended' |
  Get-OperationStatus -WaitToComplete
Management CmdLetsでアプリを停止するサンプル・スクリプト
<サービス名>は、Windows Azure Platform開発者ポータル上のWindows Azureクラウド・サービスの名前である。
<サブスクリプションID>は、そのクラウド・サービスの[Account]タブの[Subscription ID]欄に記載されている(例:「31a63f1e-0d10-4c63-a6a6-dcf065ac134a」のような)ID値である。
<証明書の母印>(Thumbprint)は、「8D3794AC5C41317C774F8E7B0E339FF40CF04FC3」のような値である。ここでは、「Get-Item cert:\CurrentUser\Root\8D3794AC5C41317C774F8E7B0E339FF40CF04FC3」というコマンドによって、クライアントにインストールされた特定の証明書を取得している。

 また下記のコードは、Management CmdLetsでアプリを起動するサンプル・スクリプトである。

$servicename = '<サービス名>'
$sub = "<サブスクリプションID>"
$cert= Get-Item cert:\CurrentUser\Root\<証明書の母印>

Get-HostedService $servicename -Certificate $cert -SubscriptionId $sub |
  Get-Deployment -Slot Production |
  Set-DeploymentStatus 'Running' |
  Get-OperationStatus -WaitToComplete
Management CmdLetsでアプリを起動するサンプル・スクリプト

 次の画面は、上記の「Management CmdLetsでアプリを停止するサンプル・スクリプト」を実行した結果だ。

Management CmdLetsでサービスを停止した例(Windows PowerShell)

 なお、Management CmdLetsを実行するには、事前に証明書の作成と設定が必要である。詳細な手順は、下記のリンク先の記事を参照していただきたい。


 INDEX
  特集:事例で学ぶWindows Azure実用ポイント 
  業務システムでWindows Azureを使うための42の覚え書き
    1.一般的なクラウドのメリットとデメリット/事例の紹介
    2.42の覚え書き:構成と課金/デプロイ
  3.42の覚え書き:ログなどの環境依存の機能
    4.42の覚え書き:SQL Azure/システム移行時の注意点/そのほか


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH