特集
Windows Azureストレージ開発入門(前編)

初めてのWindows Azureテーブル・ストレージ開発

野村総合研究所 勇 大地
2009/12/22
Page1 Page2

Azure関連の記事

まだ知らない人のための最新Azure入門 - Build Insider

Azure TIPS - Build Insider

ここまで進化した、Azure Webサイトの世界観(2014年7月版) - Build Insider

連載:Windows Azureモバイルサービスで作る簡単スマートフォンアプリ - Build Insider

Microsoft Azureプレビュー・ポータルの機能とは? - Build Insider

特集:Windows Azureメディア・サービスを利用したストリーミング配信 - Build Insider

連載:Microsoft技術におけるアイデンティティ連携開発のいま - Build Insider

Vittorio Bertocci氏インタビュー: 開発者にとってのWindows Azure Active Directoryの役割と今後の展開 - Build Insider

その知識、ホントに正しい? Windowsにまつわる都市伝説(6):Microsoft Azureの秘密を探る[その1] - @IT

進化を続けるマイクロソフトのクラウド:Windows Azureの“いま”を知る - @IT

Azure - Build Insider

1. Windows Azureストレージの概要

 本稿では、Windows Azureにおけるストレージ環境である「Windows Azureストレージ」の概要と、同環境における開発例および開発の注意点について紹介する。

 本稿は以下の開発環境を前提としている。特にWindows Azure SDK(Software Development Kit)のバージョンには注意していただきたい(現時点では、これらはすべて無償でダウンロード可能である)。

 今回の前編では、Windows Azureストレージの概要と、従来のリレーショナル・データベース(以下、RDB)との違いについて解説する。また、Windows Azureストレージのテーブルを用いたコーディング例を示し、活用する際のポイントを述べる。次回となる後編では、Windows Azureストレージのブロブやキューの実装方法を紹介する。

Windows Azureストレージとは

 Windows Azureでは、利用可能なストレージ・サービス(=データを保存する仕組み)の1つとして、Windows Azureストレージが提供されている(また、SQL AzureというRDBサービスも提供されている。これについての詳細は後述)。

 Windows Azureストレージのアーキテクチャは、従来のストレージ環境やRDBとは大きく異なる。従来のストレージ環境では、開発者がハードウェアの追加や運用を行うことで拡張性と可用性を維持していた。しかしWindows Azureストレージでは、既存のファイル・システムと異なるアーキテクチャで提供することで拡張性と可用性を担保している。従って、その拡張性と可用性を生かすには、Windows Azureストレージのアーキテクチャや特性を理解したうえで開発を行うことが不可欠である。

テーブル、ブロブ、キューとは

 Windows Azureストレージは、テーブル、ブロブ、キュー、ドライブと呼ばれる4つのストレージ・サービスを提供している(ドライブは2010年2月から提供予定)。

分類 ストレージ名 概要
Windows Azureストレージ テーブル 分散Key-Valueストア
ブロブ 大容量バイナリ格納
キュー ロール間のメッセージ受け渡し領域
ドライブ NTFSボリューム(2010年2月から提供予定)
Windows Azureで提供されるストレージ・サービス

 これらのストレージ・サービスは、次の図に示すように、Windows Azureの「Webロール」(=Webアプリケーション)や「Workerロール」(=バックグラウンド処理)などのアーキテクチャや特性に応じて使い分けられる。

Windows Azureストレージ・サービス(テーブル、ブロブ、キュー)の活用イメージ

 以下では、ドライブを除くストレージ・サービスの、テーブル、ブロブ、キューについてもう少し詳しく解説しよう。

テーブル(Table)

 表形式の構造を持ったデータの格納に利用できる。ただし、テーブル・ストレージは、RDBにおける「テーブル」とは構造が異なるストレージであり、クラウドで広く利用されている「分散Key-Valueストア」である。分散Key-Valueストアとは、「キー」と「値」のペアからなるストレージのことで、代表的なものにグーグルが提供する「Bigtable」などがある。

 データ構造がシンプルなため、分散化や高可用性の実現に適しているが、逆にRDBが得意とする複雑な検索・集計やトランザクション処理は得意ではない。テーブル・ストレージを利用した開発を行う場合、分散Key-ValueストアとRDBの、この特徴の違いを理解することが重要なポイントとなる。

 本稿では分散Key-Valueストアについて詳細な解説はしない。詳しくは、別途「もう1つの、DBのかたち、分散Key-Valueストアとは」を参照のこと。

ブロブ(BLOB:Binary Large OBject)

 名前の示すとおり、大容量のバイナリ・データを格納するために利用され、3つのストレージのうち最もシンプルなストレージである。単純な構成を持つファイル・システムのようなもので、主に画像や動画などのバイナリ・データの保存に利用できる。

 ブロブ・ストレージでは、最大1TByteまでファイルをアップロード可能である。また、WebロールやWorkerロールのログもブロブ・ストレージに保存される。

キュー(Queue)

 ブロブ・ストレージやテーブル・ストレージのようにデータを格納するための用途でなく、WebロールとWorkerロールの間でのデータ受け渡しに利用されるストレージである。

 例えば、サービス利用者からのリクエストをWebロールで受け取り、データをキューに書き込み、Workerロールで処理を実行するといった用途で利用できる。Webロール、Workerロール、キューをうまく組み合わせることで、一連の処理を非同期に効率よく行うことができる。

 テーブル/ブロブ/キュー・ストレージの概要と最大容量を、下の表にまとめる。ブロック・ブロブとページ・ブロブの違いは後編で説明する。

ストレージの種類 用途 最大容量
テーブル 非RDBの分散Key-Valueストアであり、表形式の構造を格納できる 1エンティティ当たり1MByteまで
ブロブ 画像や音声などの大容量バイナリ・データを格納できる 1ブロブ当たり、ブロック・ブロブは200GByteまで、ページ・ブロブは1TByteまで(メタデータは8KByteまで)
キュー ロール間におけるメッセージの受け渡しに利用できる 1メッセージ当たり8KByteまで
Windows Azureストレージにおける、各ストレージの概要

SQL Azureとのすみ分け

 クラウドにおけるストレージは、Windows Azureストレージのテーブルでも採用されている分散Key-Valueストアが主流となっている。しかし、現在も広く活用されているRDBは当面利用が続くと考えられ、開発者も「RDBの開発」から「分散Key-Valueストアの開発」にそのまま移行できるわけではない。

 前述したとおり、分散Key-Valueストアでは、分散処理や可用性担保が容易である一方で、RDBが得意なテーブルとテーブルを結合する処理や、複雑な条件検索や集計処理を簡単に行うことができない。また、トランザクションによる「ACID特性」(=「原子性:Atomic」「一貫性:Consistent」「独立性:Isolated」「持続性:Durable」の4特性)の確保もアプリケーション開発者のスキルに依存することになる。

 そうした問題に対応するため、マイクロソフトはクラウド上のRDBサービスとしてSQL Azure(=SQL Serverのクラウド版)を提供している。SQL Azureを活用するシナリオとしては以下が考えられる。

  • RDBなどに格納されている既存資産のデータを、そのままWindows Azureのサービスで利用する場合
  • Windows Azureのスケーラブルな環境を利用し、ストレージ・アクセスは従来の開発手法で行う場合

2. Windows Azureストレージ開発の基礎知識

 実際にWindows Azureストレージの開発を始める前に、Windows Azureストレージ開発の基礎知識を説明しておこう。

2種類のストレージ・アクセス手法

 Windows Azureストレージにアクセスするインターフェイスは、次の2つが提供されている。

 本稿ではADO.NET形式でのストレージ・アクセスについて取り扱う。

ローカル環境でのストレージ開発

 November 2009 SDKによりインストールされるWindows Azureのローカル開発環境には、本番のWindows Azureストレージとは別に、ローカル環境における開発用ストレージである「Development Storage」が存在する。[スタート]メニューから[すべてのプログラム]−[Windows Azure SDK v1.0]−[Development Storage]を選択すると、そのDevelopment Storageのアプリケーションが開始される。

 この状態で、Windowsタスクバーの通知領域にあるWindows Azureのアイコンを右クリックし、表示されるコンテキスト・メニューから[Show Development Storage UI]を実行すると、Development Storage UIを起動できる。これにより、ローカル環境の各ストレージの状態(=「Running:実行中」や「Stopped:停止中」など)とエンドポイント(=URLアドレス)を確認できる。

ローカル環境における開発用ストレージのUI画面である「Development Storage UI」
本稿では主にDevelopment Storageにおけるストレージ開発を取り扱う。

Windows Azureクラウド・サービスのソリューションの作成手順

 Windows Azureストレージを利用する前に、Windows Azureクラウド・サービスを実装するソリューションの作成手順についても再確認しておこう。

 Visual Studioを起動し、メニューバーから[ファイル]−[新規作成]−[プロジェクト]を選択して[新しいプロジェクト]ダイアログを起動する。[プロジェクトの種類]から[Cloud Service]を選択し、[テンプレート]から[Windows Azure Cloud Service]を選択する。

[新しいプロジェクト]ダイアログ
Windows Azureは.NET Framework 3.5で動作しているため、デフォルトの.NET Framework 4.0から変更すること。

 これにより、[New Cloud Service Project]ダイアログが表示されるので、ソリューションに加えるロールを追加する。下の画面例では、C#の「ASP.NET Web ロール」と「Workerロール」を追加した。ここで[OK]ボタンを選択すると、ソリューションが作成される。

[New Cloud Service Project]ダイアログ

Development Storageにアクセスするための基本設定

 以下で紹介する設定内容は、本稿で解説する開発手順を実施するために必要である。

 [ソリューション エクスプローラー]で、クラウド・サービスのプロジェクト(この例では「QueueConfirmCloudService」)の「Roles」フォルダ内のロール(この例では「WebRole1」もしくは「WorkerRole1」)をダブルクリックして、各ロールついての設定を行うプロパティ・ページを開く。

[ソリューション エクスプローラー]で設定を変更するロールを選択

 ロールに対する設定を行うプロパティ・ページが表示されたら、[Settings]タブを選択し、各ロールに対してDevelopment Storageにアクセスするための設定(=下の表の内容)を追加する。追加するには、プロパティ・ページ上部の[Add Setting]をクリックする。

パラメータ
Name DataConnectionString
Type ConnectionString
Value UseDevelopmentStorage=true
ロールの情報を設定
本番のWindows Azureストレージにアクセスするためには、別途、Windows Azure開発者ポータル・サイトにアクセスして、Windows Azureストレージ・アカウントを取得する必要がある。

 この設定により、クラウド・サービス構成定義ファイル(.csdef)やクラウド・サービス構成設定ファイル(.cscfg)に設定が追加される。

Development Storageにアクセスする構成設定のセットアップ

 先ほどの作業によりクラウド・サービス構成設定ファイル(.cscfg)内に設定されたストレージ・アクセスの情報を活用するには、基本的にCloudStorageAccount.FromConfigurationSettingメソッド(詳細後述)を使用する。このメソッドを利用するには構成設定パブリッシャのセットアップが必要になる。

 Visual StudioでWebロールやWorkerロールのプロジェクトを作成すると、WebRole.cs/WebRole.vbやWorkerRole.cs/WorkerRole.vbというソース・ファイルが自動生成され、そのファイル内ではRoleEntryPointクラス(Microsoft.WindowsAzure.ServiceRuntime名前空間)を継承したWebRoleクラスやWorkerRoleクラスが作成されている。これらのクラス内では、ロール・インスタンスの起動時に呼び出されるOnStartメソッドがオーバーライドされている。

 このOnStartメソッドに、構成設定パブリッシャのセットアップを記述する。具体的には、次のコードの「CloudStorageAccount構成設定パブリッシャのセットアップ」の部分を追記する。なおRoleEnvironmentChangingメソッド(=RoleEnvironmentクラスのChangedイベント・ハンドラ)は(下記のコードで実装しているので)削除してよい。

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

public override bool OnStart()
{
  DiagnosticMonitor.Start("DiagnosticsConnectionString");

  #region CloudStorageAccount構成設定パブリッシャのセットアップ

  // クラウド・サービス構成設定ファイル(.cscfg)の設定が
  // 変更されたときに、CloudStorageAccountインスタンスを
  // 更新する構成設定パブリッシャ用のハンドラをセットアップする
  CloudStorageAccount.SetConfigurationSettingPublisher(
    (configName, configSetter) =>
  {
    // 構成設定パブリッシャ(configSetter)に構成設定の初期値を提供
    configSetter(
      RoleEnvironment.GetConfigurationSettingValue(
        configName));

    // 構成設定の変更をハンドリングする
    RoleEnvironment.Changed += (sender, arg) =>
    {
      if (arg.Changes
        .OfType<RoleEnvironmentConfigurationSettingChange>()
        .Any((change) =>
          (change.ConfigurationSettingName == configName)))
      {
        // 対応する構成設定が変更されたら、
        // 構成設定パブリッシャ(configSetter)にその最新値を提供
        if (!configSetter(
          RoleEnvironment.GetConfigurationSettingValue(
            configName)))
        {
          // クラウド・サービス構成設定ファイル(.cscfg)での
          // ストレージ・アカウントの認証情報の変更
          // (例えば、エンドポイントが変わったような場合)は
          // 非常に重要なので、その最新の構成設定が使われるように、
          // ロールをリサイクルする必要がある。
          RoleEnvironment.RequestRecycle();
        }
      }
    };
  });
  #endregion

  return base.OnStart();
}
Imports Microsoft.WindowsAzure
Imports Microsoft.WindowsAzure.Diagnostics
Imports Microsoft.WindowsAzure.ServiceRuntime

#Region "CloudStorageAccount構成設定パブリッシャのセットアップ"

Public Overrides Function OnStart() As Boolean

  DiagnosticMonitor.Start("DiagnosticsConnectionString")

  ' クラウド・サービス構成設定ファイル(.cscfg)の設定が
  ' 変更されたときに、CloudStorageAccountインスタンスを
  ' 更新する構成設定パブリッシャ用のハンドラをセットアップする
  CloudStorageAccount.SetConfigurationSettingPublisher( _
    Function(configName, configSetter) _
      SetConfig(configName, configSetter))

  Return MyBase.OnStart()

End Function

Private Function SetConfig(ByVal configName As String, ByVal configSetter As System.Func(Of String, Boolean)) As Object

  ' 構成設定パブリッシャ(configSetter)に構成設定の初期値を提供
  configSetter( _
    RoleEnvironment.GetConfigurationSettingValue( _
      configName))

  ' 構成設定の変更をハンドリングする
  AddHandler RoleEnvironment.Changed, Function(sender, arg) _
    SetConfigSetter(sender, arg, configName, configSetter)

  Return Nothing

End Function

Private Function SetConfigSetter(ByVal sender As Object, ByVal arg As Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironmentChangedEventArgs, ByVal configName As String, ByVal configSetter As System.Func(Of String, Boolean)) As Object

  If arg.Changes _
      .OfType(Of RoleEnvironmentConfigurationSettingChange)() _
      .Any(Function(change) _
        (change.ConfigurationSettingName Is configName)) Then

    ' 対応する構成設定が変更されたら、
    ' 構成設定パブリッシャ(configSetter)にその最新値を提供
    If Not configSetter( _
        RoleEnvironment.GetConfigurationSettingValue( _
          configName)) Then
      ' クラウド・サービス構成設定ファイル(.cscfg)での
      ' ストレージ・アカウントの認証情報の変更
      ' (例えば、エンドポイントが変わったような場合)は
      ' 非常に重要なので、その最新の構成設定が使われるように、
      ' ロールをリサイクルする必要がある。
      RoleEnvironment.RequestRecycle()
    End If
  End If

  Return Nothing

End Function

#End Region
OnStartメソッドにおける構成設定パブリッシャ・セットアップのコード例(上:WebRole.cs/WorkerRole.cs、下:WebRole.vb/WorkerRole.vb)
Visual Basic 9の場合は複数行のラムダ式が使えないため、別関数に分けて記述している。

 以上で準備は完了だ。

 それでは、実際にWindows Azureストレージを利用した開発例を紹介していこう。


 INDEX
  特集:Windows Azureストレージ開発入門(前編)
  初めてのWindows Azureテーブル・ストレージ開発
  1.Windows Azureストレージの概要
    2.Windows Azureテーブル・ストレージでの開発
 
  特集:Windows Azureストレージ開発入門(後編)
  初めてのブロブ&キュー・ストレージ開発
    3.Windows Azureブロブ・ストレージでの開発
    4.Windows 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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

キャリアアップ

.NET未来展望台

未来展望台コーナースポンサーからのお知らせ


- PR -
- PR -
ソリューションFLASH

「ITmedia マーケティング」新着記事

プログラマティック広告はどう変化? 米国レポートから見える「今後の動向」
CTVとプライベートマーケットプレイスへの広告支出のシフトにより、米広告業界ではプログ...

「顧客体験」の重要性高まる 2024年「CX」関連の人気記事TOP10を紹介
今回の記事では、2024年「ITmedia ビジネスオンライン CX Experts」のアクセスランキング...

SNSの情報がアルゴリズムで最適化されていることを「知らない」が6割超 年代別では?
ロイヤリティ マーケティングは、10〜60代のSNS利用者を対象に、SNS情報の信用度に関する...