はじめに

前回記事では、Azureの概要とアカウント登録方法、そして簡単なASP.NETのWebアプリケーションを作成し、公開するところまでを紹介しました。想像していたより簡単にできたと思っていただけたでしょうか?

実際のWebアプリケーションを作るには、あともう少しの機能が必要です。本記事ではデータを保存する仕組みの一つであるストレージについて、サンプルを交えながら紹介します。

前回同様、本連載では次の環境で動作確認を行っています。


・Windows 10 Pro
・VisualStudio Community 2015 Update3(以降、VS2015)
・Microsoft Azure SDK for .NET(VS 2015) 2.9.6

本稿で説明するリストはサンプルの中に収録しています。ご活用ください。

ストレージ(Azure Storage)

ストレージ(Azure Storage)とは、Azureのクラウド環境上に構築された、スケーラブルかつ高信頼性、高可用性を備えたデータストレージです。ストレージで扱うことのできるデータはBLOB(オブジェクト)、ファイル、キュー、テーブルの4種類あり、目的によって使い分けることができます。

.NET Frameworkだけに閉じたサービスではなく、JavaやNode.jsなどからもアクセスするためのSDKが提供されており、SDK未サポートの環境からでもREST API経由でアクセスすることができます。以降では4種類のストレージタイプの特徴を紹介します。

BLOBストレージ

BLOBストレージとは、非構造化データデータをAzure上にオブジェクトまたはBLOB(Binary Large Object)として格納することのできるサービスです。具体的には画像ファイルやアプリケーションなどのバイナリデータやテキストデータなどを格納できます。

BLOBストレージの概念

BLOBストレージを構成する要素には、ストレージアカウント、コンテナ、BLOBがあります。コンテナはBLOBをグループ化しますが、様々な形式のデータを同じコンテナに格納することができます。1つのストレージアカウントに格納できるコンテナ数、1つのコンテナに格納できるBLOB数に制限はありません。またコンテナ名は、小文字のアルファベット、数字、ダッシュ(-)からなる3文字以上から63文字以下の文字列で命名する必要があります。

BLOBは様々な種類およびサイズのデータファイルで、BLOBストレージで提供されるBLOBにはブロックBLOB、追加BLOB、ページBLOBの3種類があります。

ブロックBLOBは、テキストやバイナリファイルを格納するのに最適化されています。追加BLOBはブロックBLOBと同様にブロックとして構成されますが、追加操作に最適化されています。このため、ログなど追記が頻繁に発生する用途に適しています。ページBLOBは読み取りや書き込み操作を頻繁に実行する用途に最適化されています。

テーブルストレージ

テーブルストレージは、エンティティとして扱われるNoSQLの構造化データをAzureクラウドに格納するサービスです。

テーブルストレージの概念

テーブルストレージを構成する要素には、ストレージアカウント、テーブル、エンティティが存在します。テーブルストレージではRDBMSのようにスキーマを設定する必要が無いため、同じテーブル内に、異なるプロパティが含まれることを許容しています。テーブルの数は、ストレージアカウント容量制限によって制限されます。

エンティティとは、プロパティの集合体であり、最大サイズは1MBとなっています。

プロパティは、名前と値の組となっており、一つのエンティティに対して最大で252個のプロパティを含むことができます。テーブルストレージのエンティティには、システムで必要とされる3つのプロパティがあります。これらはそれぞれParitionKey、RowKey、Timestampであり、Timestampについてはシステム側で設定されます。

テーブルストレージの裏側では、テーブルは複数のパーティションから構成されています。PartitionKeyはこのパーティションを識別するために利用されます。またパーティション内では、RowKeyにより一意になるように制約されます。

これらのことから、テーブルストレージに保存されるエンティティは、PartitionKeyとRowKeyの組み合わせで一意にする必要があります。

キューストレージ

キューストレージは、アプリケーションコンポーネント間をつなぐメッセージングの仕組みを提供するサービスです。対象となるアプリケーションはクラウドやデスクトップ、オンプレミスのサーバー、そしてモバイルデバイスのいずれで実行されている場合でも、各種コンポーネントの間を非同期通信でメッセージをやり取りすることができます。

キューストレージの概念

キューストレージを構成する要素にはストレージアカウントとキュー、メッセージがあります。キューはメッセージを格納する箱であり、小文字のアルファベット、数字、ダッシュ(-)からなる3文字以上から63文字以下の文字列で命名する必要があります。

メッセージは文字列またはバイト配列から構成されるデータで、どちらの形式の場合でも最大サイズは64KBとなっています。1つのキューに登録可能なメッセージ数は明示的には決められていませんが、ストレージアカウントの合計容量の上限まで格納することができます。またメッセージがキューに保持される期間は最長で7日間であり、それを超えるとシステム側で自動的に削除されます。

このような特徴から、キューストレージは画像の変換など時間のかかる処理の情報をメッセージとしてキューに格納しておき、手の空いたプログラムがキューから取り出して処理を行うという用途で使われることが多く見られます。

ファイルストレージ

ファイルストレージは、SMB(Server Message Block)プロトコルを利用したファイル共有を提供するサービスで、SMBのバージョンは2.1と3.0の両方がサポートされています。このことから通常のWindows PCからのファイル共有だけでなく、PowerShellやプログラムから共有ファイルにアクセスすることができます。

ファイルストレージの概念

ファイルストレージを構成する要素には、ストレージアカウント、共有、ディレクトリ、ファイルがあります。共有とはAzure上でのSMB共有のことであり、一つのマウントポイントとなります。

アカウントに含まれる共有の数、格納できるファイル数には制限がありませんが、合計容量として5TBの上限があります。また、1つのファイルサイズの上限は1TBとなっています。

Azureストレージアカウントの作成

ストレージを利用するには、ストレージアカウントを別途作成する必要があります。Azureダッシュボードの左側にあるリソース一覧から[ストレージアカウント]を選択し、[追加]をクリックします。

ストレージアカウントの作成

作成するにあたっては利用用途によって次のような情報を入力します。

ストレージアカウントの入力項目

項目名 概要
名前 ストレージアカウントの識別名
デプロイモデル 従来の仮想ネットワークにデプロイされた既存アプリケーション以外では「Resource Manager」(*)を選択する
アカウントの種類 BLOBデータを扱うにはBLOBストレージを選択する
パフォーマンス StandardはHDDだが、PremiumではSSDを利用することで高速なアクセスが可能
レプリケーション データの持続性、高可用性を確保するためのオプションで選択肢によりコストが異なる
ストレージサービスの暗号化 保存したデータを暗号化するかどうか
サブスクリプション 利用可能なサブスクリプション(無料試用版など)
リソースグループ 同じライフサイクル、アクセス許可、およびポリシーを共有するリソースのコレクション
場所 ストレージを動かすリージョン
*)Resource Managerを選択すると複数のリソースをグループとしてデプロイ、管理、監視できるようになります

ストレージアカウントの設定例

必要な情報を入力し、「作成」をクリックしましょう。しばらく待つと次のようにストレージアカウントが作成されます。

作成したストレージアカウント

Azureストレージエミュレータ

実際のプログラムの開発に入る場合、開発環境でストレージを利用できるようにするためにAzureストレージエミュレータを紹介します。

ストレージエミュレータとは、その名の通りAzure上のストレージにアクセスすること無く、ローカル環境で開発やテストに利用することのできる環境です。なおストレージエミュレータがサポートするストレージの種類は、BLOB、キュー、テーブルの3種類のみであり、ファイルはサポートしていませんので注意してください。

ストレージエミュレータのインストール

ストレージエミュレータは、Azureダウンロードサイトから入手します。「Azure Storage Emulator」の「Install」をクリックしてインストーラをダウンロードします。

Azureダウンロードサイト

ダウンロードしたファイル「MicrosoftAzureStorageEmulator.msi」をダブルクリックしてインストーラを起動してください。

ストレージエミュレータについて詳しく知りたい方は、開発とテストのための Azure のストレージ エミュレーター使用をご覧ください。

なお、ストレージエミュレータに登録されたBLOB、キュー、テーブルストレージの内容はVS2015のサーバーエクスプローラーで閲覧、操作することが可能です。開発時のデータ確認等にご活用ください。次の図は、本記事のサンプルをすべて実行した後のサーバーエクスプローラーでの表示例です。

VS2015のサーバーエクスプローラー

各種ストレージの使い方

本記事では、4種類あるストレージの中からBLOB、キュー、ファイルストレージについてサンプルプログラムを用いて使い方を紹介します(テーブルについては次回解説します)。なお、サンプルはすべてコンソールプログラムとして作成してあります。

ストレージエミュレータへの接続設定

最初に先ほどインストールしたストレージエミュレータに接続するための設定方法を説明します。ストレージエミュレータに接続するには、BLOB、キューの各サンプルプロジェクトディレクトリ(BlobStorageSample、QueueStorageSample)以下にあるにある「App.config」ファイルに次のように記述します。

App.config(抜粋)

 <appSettings>
  <add key="StorageConnectionString" value="UseDevelopmentStorage=true;" />
 </appSettings>

プログラムから識別できるキーに対する値として、「UseDevelopmentStorage=true」を指定しています。今回の例ではキーとしてStorageConnectionStringを使用しています。この文字列はプログラム中にも出てきますので覚えておいてください。

必要なパッケージのインストール

ストレージを利用するためには、いくつかのパッケージ(ライブラリ)が必要となります。.NET Frameworkにはこれらのライブラリを管理するための仕組みであるNuGetが提供されており、Visual Studioにも組み込まれています。このNuGetを利用して次の2つのパッケージをインストールします。

インストールするパッケージ

名称 概要
WindowsAzure.Storage ストレージサービスにアクセスするクライアント機能
Microsoft.WindowsAzure.ConfigurationManager オンプレミスやクラウド環境の区別なく構成設定を読み込む機能
それではこの2つのパッケージをインストールしましょう。VS2015のメニューから、[ツール]-[NuGetパッケージマネージャー]-[ソリューションのNuGetパッケージの管理]を選択すると、次のようなソリューションのパッケージ管理画面が表示されます。ここで検索窓に「WindowsAzure」と入力し、必要な2つのパッケージを選択してインストールしてください。

NuGetパッケージマネージャー

本記事のサンプルプログラムをお試しいただく際には、ソリューションを開いたあとでNuGetを復元し、必要なパッケージのインストールを行ってください。パッケージの復元を実行するには、ソリューションエクスプローラーからソリューションを選択し、右クリックメニューから[NuGetパッケージの復元]を選択します。

NuGetパッケージの復元

BLOBストレージにファイルを登録

最初にBLOBストレージにファイルを登録する例を紹介します。すべてのコードは「BlobStorageSample」プロジェクトをご覧ください。以下は画像ファイルをalbumコンテナにmyphotoという名前で登録している例です。

Program.csのMain関数(抜粋)

 // (1)App.configに指定した接続情報を取得
 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
   CloudConfigurationManager.GetSetting("StorageConnectionString"));
 // (2)BLOBクライアントを作成
 CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
 // (3)BLOBコンテナへの参照を取得し、存在しない場合には作成する
 CloudBlobContainer container = blobClient.GetContainerReference("album");
 container.CreateIfNotExists();
 // (4)ブロックBLOBの参照を取得する
 CloudBlockBlob blockBlob = container.GetBlockBlobReference("myphoto");
 // (5)"myphoto"という名前でローカルの写真ファイルを作成する。
 //    存在する場合には上書きする。
 using (var fileStream = System.IO.File.OpenRead(@"C:\Photo.jpg"))
 {
   blockBlob.UploadFromStream(fileStream);
 }

(1)では、先ほど説明したApp.configに記述されたStorageConnectionStringをキーとして、対応する接続情報を取得してCloudStorageAccountのオブジェクトを取得しています。このコードはBLOG以外のストレージタイプでも共通の処理となります。そして(2)で各種ストレージタイプに対応したクライアントを作成します。

次にBLOBデータを保存する先であるコンテナ(3)、ブロックBLOBの参照を取得します(4)。この例では、Cドライブ直下に置かれたPhoto.jpgファイルのストリームを取得し、ブロックBLOBのUploadFromStreamメソッドに渡すことでアップロードを実行しています(5)。

キューストレージへのメッセージ登録と取得

 次はキューストレージにメッセージをキューに登録、取得する例を紹介します。こちらのコードは「QueueStorageSample」プロジェクトをご覧ください。

Program.csのMain関数(抜粋)

 // (1)App.configに指定した接続情報を取得(省略)
 // (2)キュークライアントの作成
 CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
 // (3)キューの参照を取得し、存在しない場合には作成する
 CloudQueue queue = queueClient.GetQueueReference("myqueue");
 queue.CreateIfNotExists();
 // (4)メッセージを作成し、キューに登録
 CloudQueueMessage message = new CloudQueueMessage("Queme sample message");
 queue.AddMessage(message);
 // (5)キューからメッセージを取得
 CloudQueueMessage retrievedMessage = queue.GetMessage();
 Console.WriteLine(retrievedMessage.AsString);
 // (6)メッセージを削除
 queue.DeleteMessage(retrievedMessage);

キューにアクセスするにはキュー用のクライアントを作成し(2)、メッセージを登録するキューの参照を取得します(3)。この例ではキュー名としてmyqueueを指定しています。

キューを登録するには、CloudQueueMessageのインスタンスを作成し、CloudQueue#AddMessage()を実行します(4)。次にキューから登録されたメッセージを取得するには、CloudQueue#GetMessage()を実行します(5)。この後でメッセージに対して必要な処理を行うわけですが、GetMessage()から30秒間は他のクライアントからは見えなくなります。30秒以内にメッセージが削除(6)されない場合には、他のクライアントで処理が実行されるようになっていますので、メッセージに対して重い処理を行う場合にはご注意ください。

ファイルストレージを使用したファイル共有

最後はファイル共有を行う、ファイルストレージの例を紹介します。こちらのコードは「FileStorageSample」プロジェクトをご覧ください。

ファイルストレージは先ほど説明したようにPowerShellやSMBによるファイル共有でもアクセスすることができますが、ここでは.NETプログラムによってファイルを操作する方法を紹介します。

Program.csのMain関数(抜粋)

 // (1)App.configに指定した接続情報を取得(省略)
 // (2)ファイルクライアントの作成
 CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
 // (3)ファイル共有への参照を取得し、存在しない場合には作成する
 CloudFileShare share = fileClient.GetShareReference("files");
 share.CreateIfNotExists();
 // (4)rootディレクトリへの参照を取得
 CloudFileDirectory rootDir = share.GetRootDirectoryReference();
 // (5)保存先ディレクトリの参照を取得し、存在しない場合には作成する
 CloudFileDirectory targetDir = rootDir.GetDirectoryReference("MyDir");
 targetDir.CreateIfNotExists();
 // (6)保存先ファイルの参照を取得
 CloudFile file = targetDir.GetFileReference("File1.txt");
 // (7)ローカルのファイルを共有ファイルにアップロード
 using (var fileStream = System.IO.File.OpenRead(@"C:\TextFile1.txt"))
 {
   file.UploadFromStream(fileStream);
 }

ファイルストレージにアクセスするには、他と同様にクライアントを作成します(2)。ファイルストレージの階層は、共有、ディレクトリ、ファイルと辿っていくことになりますので、最初に共有オブジェクトへの参照を取得します(3)。Windowsなどのディレクトリ階層と同様にルートディレクトリから始まって(4)、実際にファイルを置くディレクトリまで辿っていきます(5)。対象のディレクトリに到達したら、共有ファイルへの参照を取得し(6)、ローカルにあるファイルのストリームをCloudFile#UploadFromStream()メソッドに渡すことで、Azureにアップロードすることができます(7)。

他の3つのストレージと異なり、ファイルストレージはストレージエミュレータに対応していません。よってこのサンプルを実行するにはAzureにアクセスする必要があります。

Azure上のファイルストレージにアクセスするための設定

これまではストレージエミュレータに対してデータを登録していましたが、Azureに登録するには接続設定にAzureのストレージアカウント名、アクセスキーを登録する必要があります。

アクセスキーを確認するには、Azureのダッシュボードにサインインし、先ほど作成したストレージのページに移動し、「アクセスキー」の項目を選択します。

ストレージのアクセスキー

アクセスキーは標準で2つ用意されており、どちらを利用してもアクセスできるようになっています。アクセスキーは定期的に更新することが推奨されており、キーを更新したタイミングで各種サービスからアクセスできなくなるのを防ぐために2つのキーを交互に入れ替えながら設定するという運用が想定されています。

先程までの例では「App.config」ファイルにエミュレーターに接続する設定を記述しましたが、Azureへ接続するためには接続キーに対する値として次の情報を指定します。

テンプレート設定

項目名
DefaultEndpointsProtocol エンドポイントへの接続プロトコル。通常はhttps
AccountName Azureに作成したストレージアカウント名
AccountKey アクセスキー。2つのうちのどちらかを指定

App.config(抜粋)

 <configuration>
 <appSettings>
 <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=ストレージアカウント名;AccountKey=アクセスキー"/>
 </appSettings>
 </configuration>

Azure上のファイルストレージに登録されたファイルは、Azureダッシュボードのストレージから、[概要]-[ファイル]と辿っていくことで確認することができます。

Azureダッシュボードからファイルストレージの内容確認

まとめ

第2回目は、4種類あるストレージについての概要説明と、BLOB、キュー、ファイルストレージのそれぞれでデータを操作する方法について、簡単なプログラムを用いて紹介しました。次回は、今回紹介できなかったテーブルストレージにデータを保存するプログラムをASP.NET MVC 5にて実装し、Azureに公開するまでを紹介する予定です。

WINGSプロジェクト 花田善仁著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。一緒に執筆をできる有志を募集中。