クラウドサービスでストレージを利用する(Storage Client 2.0編)

2013年4月9日 | By TatsuakiSakai | Filed in: Micosoft Azure.

1. ストレージの概要

ストレージは、Windows Azure上で実行される様々なサービスが利用するデータやファイルなどを永続化するための領域を提供するサービスです。

ストレージはWindows Azureの様々なサービスで利用されます。たとえば、クラウドサービスへデプロイするアプリケーションパッケージを一時保存したり、仮想マシンのVHDイメージを格納したり、クラウドサービスで出力した様々なログ情報をアーカイブして保存したり・・・・と様々です。

このように、Windows Azureにおいてストレージは重要なサービスであるといえます。

ストレージは利用目的によりBlob、Table、Queueといった3種類のストレージ領域を提供します。

・Blob

BlobはBinary Large Objectを意味します。そのまま大容量のバイナリ形式オブジェクトを格納します。つまり、大容量のファイルをそのまま格納できるような記録領域になります。

Blobには2種類の形式が存在します。1つは4MB以下の可変長の「ブロック」に分割可能なBlock Blobです。Block Blobは200GByte以下のバイナリデータを保持することが可能です。

そしてもう1つは512Byte固定長の「ページ」に分割可能なPage Blobです。

・Table

TableはKey/Value型のNo SQLデータベースとして利用可能なストレージです。

1つのテーブルに対して複数のエンティティが属します。各エンティティはPartition KeyおよびRow Keyという2種類のキーの組み合わせで特定が可能です。

1つのエンティティには複数のプロパティを含めることができ、最大255個までのプロパティを指定することが可能です。

なお、各プロパティの合計長は1Mバイト以下である必要があります。

・Queue

読んで字のごとく、キュー形式のストレージです。キューは他の2種類のストレージと異なり、データの永続化を目的とするよりも、非同期のサービス間連携を実現することを目的としたストレージです。

そのため、Queueという名前からも分かるように、あらかじめメッセージを格納しておき、後からFIFO形式で取り出して参照することができます。

なお、Queueに格納できるメッセージが8KB以下のテキストデータに限定されます。

以上、簡単にストレージの概要を説明させていただきました。

詳しい説明は他にも多くのリソースが存在しますので、ここでは割愛いたします。

これらのストレージへはRESTを用いてアクセスすることが可能です。

そのため、多くのプラットフォームからストレージにアクセスすることが可能です。

 

2. Storage Client 2.0の導入

Windows Azureで提供されるストレージはRESTインタフェースを提供しています。

また、マネージド・コード(.NET)で記述されたアプリケーションからストレージへ容易にアクセスすることができるよう、Storage Clientというライブラリが提供されています。

Storage Clientは.NET用のWindows Azure SDKにバージョン1.7が含まれていますが、この記事では最新のStorage Client 2.0を利用してストレージにアクセスしてみましょう。

Storage Client 2.0はNuget経由で入手が可能です。

まずは下準備として、第2回同様ASP .NET Webロールのプロジェクトを作成しておきましょう。

次に、ソリューションエクスプローラーのASP .NETアプリケーションプロジェクトでコンテキストメニューを表示し「NuGetパッケージの管理…」を選択します。

オンラインの検索を実行し「Azure Storage Client 2」と検索してみます。

検索結果に「Windows Azure Storage」のバージョン2.0xが存在したならば、「インストール」をクリックしてStorage Client 2.0を取り込みます。

インストールが完了したら、いよいよインプリメントを開始していきましょう。

 

3.Storage Client 2.0を利用してBlobをアップロード

それでは、さっそくストレージを利用するためのインプリメントを開始しましょう。

今回はストレージの「はじめの一歩」ということで、Blobを扱ってみたいと思います。

そこで、Webブラウザからコンピュータに格納されたファイルをBlobにバックアップするアプリケーションを作ってみましょう。

その前に、ストレージの接続文字列を指定します。

Webロールのプロパティを開き「設定」タブを開きます。

「設定の追加」をクリックし、接続文字列を追加します。

この時、Windows Azureのストレージアカウントを設定しても構いませんしストレージエミュレーターを指定しても構いません。

第3回でVisual Studioを用いてデプロイした際にストレージアカウントを作成してありますので、今回はそれを使ってみましょう。

接続文字列の名前を「ConnectiionString1」という名前で作成して保存しておきます。

次に、Default.aspxを以下のようにデザインします。

ここにはASP .NET FileUploadコントロール(flUploadFileと命名)とButtonコントロール(btnSubmitFileと命名)を貼り付けています。

これでフォームの準備は完了です。

それではコードを記述していきます。

まずはusingディレクティブに以下の参照を追加しておきます。

 

using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Core;
using Microsoft.WindowsAzure.Storage.RetryPolicies;

 

Storage Client 1.7以前のバージョンを利用したことがある方なら「おや?」と思うかもしれません。

そうです。2.0で名前空間が変更されています。以前は「Microsoft.WindowsAzure.StorageClient」でした。2.0では「Microsoft.WindowsAzure.Storage.xxxx」の形式に変更されています。

また、ライブラリが各ストレージ向けに提供されていますので、Blobを利用する場合には「~Storage.Blob」を、Tableを利用する場合には「~Storage.Table」を参照します。

次に、ストレージへアクセスするコードをご紹介します。

 

private  CloudStorageAccount myaccount; //ストレージアカウント

private  CloudBlobClient myBlobClient; //Blobおよびコンテナへアクセスするためのクライアント
CloudBlobContainer myBlobContainer; //Blobコンテナ

protected void Page_Load(object sender, EventArgs e)
{

 //構成情報からストレージアカウントオブジェクトを生成
myaccount
= CloudStorageAccount

.Parse(RoleEnvironment.GetConfigurationSettingValue(“ConnectionString1”));
//Blobクライアントを生成
myBlobClient = myaccount.CreateCloudBlobClient();
//Blobコンテナのリトライポリシーの設定(100ms間隔でに2回までリトライ)
myBlobClient.RetryPolicy = new
LinearRetry(TimeSpan.FromMilliseconds(100), 2);
//Blobコンテナの参照を取得
myBlobContainer = myBlobClient.GetContainerReference(“mypictures”);

//参照したコンテナが存在しない場合は新規に作成
myBlobContainer.CreateIfNotExists();

}

protected void btnSubmitFile_Click(object sender, EventArgs e)
{

 //ファイルアップロードにアップロードするファイルが設定されているか?
if (flUploadFile.HasFile)
{

//アップロードするファイルを格納するBlobへの参照を所得
CloudBlockBlob blbUploadFile
= myBlobContainer.GetBlockBlobReference(flUploadFile.FileName.ToLower());
//ストリームからファイルの内容をBlobへアップロード
blbUploadFile.UploadFromStream(flUploadFile.PostedFile.InputStream);

}

}

Storage Client 1.7以前では、Global.asaxに「おまじない」のコードを記述する必要がありました。

この「おまじない」はRoleのプロパティの接続文字列を読み出し、ストレージアカウントを作成するために必要でした。

2.0ではこの手間が不要になっています。

そのまま、CloudStorageAccountのStaticメソッドであるPerseを実行することで、接続文字列からストレージアカウントを作成することが可能です。

この時、パラメータにWebロールのプロパティで定義した「ConnectiionString1」の値を読み込んでいます。

次に、BlobへのアクセスをつかさどるBlobClientのインスタンスを作成します。

これまでのバージョンと同様、CloudStorageAccountのCreateBlobClientメソッドを実行することで、BlobClientを作成可能です。

次に、リトライポリシーを設定しておきましょう。これは必須ではありませんが、アップロードを確実に実行したい場合には設定しておいたほうが良いでしょう。

この例では、何かしらの問題が発生した場合は100ms後に再送し、これを2回まで繰り返すように指定してあります。

続いて、コンテナを取得します。この手順はある意味「お決まり」の手順になっており、まずはコンテナの参照を取得し、存在しない場合には新規に作成するという流れです。

この「お決まり」の流れはQueueストレージのQueueやTableストレージのTableも同様です。

さて、コンテナが作成されれば事前準備は完了です。

次に、Blobにデータをアップロードする手順を解説しましょう。btnSubmitFile_Clickイベントハンドラ内を見ていきます。

まず、ファイルアップロードにファイルが指定されているか否かをチェックし、ファイルが指定されている場合にアップロードを実行します。

Blobに関しても、コンテナ同様まずはBlobの参照を取得します。GetBlockBlobReferenceメソッドがそれに該当します。

なお、Storage Client 2.0では取り扱うBlobの種類がBlock BlobかPage Blobに限定されます。

旧バージョンで存在したCloudBlobオブジェクトはこのライブラリにはありません。

この例ではBlock Blobを通常のBlobとして扱っています。

次に、ファイルアップロードのストリームからデータを読み出し、Blobへアップロードを実行します。

UploadFromStreamメソッドがこれに該当します。逆にBlobから手元のストリームにダウンロードする場合にはDownloadToStreamメソッドを実行します。

 

4.管理ポータルでストレージを管理

それでは、アップロードされたBlobを確認してみましょう。

ストレージにアップロードされたBlobを確認するためには、管理ポータルが利用できます。

管理ポータルにログインし「ストレージ」を開いてみましょう。

アップロードしたストレージのダッシュボードを開くと「コンテナー」というタブが存在するのがわかります。

コンテナータブを選択すると、作成されたコンテナの一覧が表示されます。

さらに、コンテナを選択すると、コンテナに格納されたBlobの一覧を表示することができます。

ここで、Blobのプロパティやメタデータの編集、Blobのダウンロード、そしてBlobの削除を実行することが可能です。

ダウンロードをクリックして実際にダウンロードしてみましょう。

ダウンロード時の振る舞いはデータの種別により異なりますが、画像データであれば、このようにWebブラウザに表示することが可能です。

 

5.最後に

今回はスペースの都合でBlobのみのご紹介になりました。

次回以降QueueやTableも織り交ぜてご紹介できたらしていきたいと考えております。

特に、Webロール & Workerロールの疎結合連携ではQueueを利用する予定です。

次回以降は、ほぼ週1ペースで更新していきますので、更新がない場合にはTwitterなどで突いていただけると幸いです(笑)。

 


Comments are closed here.