はじめに
今回は前回に引き続き、Azure Storageの各データサービスについてサンプルを交えながら紹介します。今回はAzure FilesおよびAzure Queueの2つのデータサービスを取り上げます。
Azure Files
まずはAzure Filesのサンプルアプリケーションを実装していきます。Azure Files用のSDKを利用してストレージアカウントに接続し、ファイルの作成とダウンロードを行うサンプルを実装します。
Azure Filesにアクセスするアプリケーションを実装しよう
はじめに前回同様、実装に必要な依存ライブラリを追加していきます。今回はAzure FilesおよびAzure Queueのサンプルアプリケーションを実装するため、以下の2つのライブラリをインストールします。
サンプルアプリに必要なライブラリ一覧
ライブラリ名 | 説明 |
---|---|
Azure.Storage.Queues | Azure Queue操作用のライブラリ |
Azure.Storage.Files.Shares | Azure Files操作用のライブラリ |
前回の手順を参考にVisual StudioのNuGetパッケージマネージャーから上記の依存ライブラリを追加します。
ここからFilesを操作するアプリケーションを実装していきます。ソリューションエクスプローラーのプロジェクトの位置(ソリューションの1つ下)で右クリックして「追加」→「新しい項目」と選択して、ファイル名を「FilesSample.cs」として「追加」ボタンを選択します。
「QueueSample.cs」の追加後、ソリューションエクスプローラーが上図の状態となっていることを確認します。
Filesにアクセスするアプリケーション(FilesSample.cs)
using Azure.Storage.Files.Shares;
namespace ZerokaraStorageConsoleApp
{
internal class FilesSample
{
public async Task Execute()
{
// ストレージアカウント名
var storageAccountName = "zerokara";
// ファイル共有名
var filesName = "zerokara-files";
// ファイル共有クライアントの作成・・・①
var connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
ShareClient shareClient = new ShareClient(connectionString, filesName);
// ファイル共有の作成・・・②
await shareClient.CreateIfNotExistsAsync();
if (await shareClient.ExistsAsync())
{
// ディレクトリの取得・・・③
var directoryClient = shareClient.GetDirectoryClient("documents");
// ディレクトリの作成・・・④
await directoryClient.CreateIfNotExistsAsync();
if (await directoryClient.ExistsAsync())
{
// ファイルの作成・・・⑤
var response = await directoryClient.CreateFileAsync("memo.txt", 100);
var file = response.Value;
if (await file.ExistsAsync())
{
// ファイルのダウンロード・・・⑥
var download = await file.DownloadAsync();
}
else
{
Console.WriteLine("file does not exist.");
}
}
}
}
}
}
BLOBの時と同様に、Executeメソッドを用意してその中でファイル操作の一連の流れを実装しています。まずはファイル共有クライアントの作成です(①)。ファイル共有はストレージアカウント内に作成するAzure Filesのルートとなるオブジェクトで、そのファイル共有を操作するためのクライアントを最初に生成します。クライアントの生成にはストレージアカウントの接続文字列と、ファイル共有名を引数に用います。
次にファイル共有クライアントを使ってファイル共有を作成します(②)。「CreateIfNotExistsAsync」というメソッド名の通り、指定した名称のファイル共有がストレージアカウント内に存在しない場合のみファイル共有を作成します。同じ名称のファイル共有がすでに存在する場合は何もしません。
ファイル共有クライアントを使い、次はディレクトリクライアントを作成します(③)。ディレクトリはWindowsのエクスプローラーと同様に、複数のファイルを含むことのできるフォルダーの役割を持ちます。ディレクトリクライアントの生成時にはディレクトリ名を引数に用います。
ディレクトリクライアントを使ってディレクトリを作成します(④)。ファイル共有クライアントと同じように「CreateIfNotExistsAsync」メソッドによりディレクトリがソウン剤しない場合のみディレクトリを作成し、すでにディレクトリが存在する場合は何もしません。
次にディレクトリクラアントを使ってファイルを作成します(⑤)。「CreateFileAsync」メソッドの第一引数にはファイル名を、第二引数にはファイルサイズをバイト単位で指定してファイルを作成することができます。
最後にファイルをAzure上からダウンロードします(⑥)。
「FilesSample.cs」を実装したら、呼び出し元になる「Program.cs」を編集します。
Program.csの編集
using ZerokaraStorageConsoleApp;
Console.WriteLine("===== BLOBのデモを開始します。 ===== ");
var blob = new BlobSample();
await blob.Execute();
Console.WriteLine("===== BLOBのデモが終了しました。 ===== ");
// Filesサンプルコードの実行を追加・・・①
Console.WriteLine("===== Filesのデモを開始します。 ===== ");
var files = new FilesSample();
await files.Execute();
Console.WriteLine("===== Filesのデモが終了しました。 ===== ");
前回までの実装でBLOBの操作を行っているので、その後ろにFilesの操作を行うための実装を追加しています(①)。先程作成したFilesSampleをインスタンス化し、Executeメソッドを呼び出しています。
ここまで実装できたら、アプリケーションを実行してみましょう。
実行後、Azureポータルからストレージアカウントを表示して左側のメニューから「ファイル共有」を選択します。するとサンプルアプリで指定した名称のファイル共有が存在することが確認できます。
ファイル共有名を選択すると、詳細画面へ遷移します。左側のメニューから「参照」を選択すると「documents」というディレクトリが表示され、ディレクトリを選択すると「memo.txt」が表示されます。
これでサンプルアプリケーションを実行することでファイル共有、ディレクトリの作成とファイルのアップロードが正しく行われていることが確認できました。
Azure Queueにアクセスするアプリケーションを実装しよう
続いて、Queueのサンプルアプリケーションを実装します。「QueueSample.cs」を作成し、Executeメソッドの中でキューにアクセスする処理を実装していきます。
「QueueSample.cs」の追加後、ソリューションエクスプローラーが上図の状態となっていることを確認します。
Queueにアクセスするアプリケーション(QueueSample.cs)
using Azure.Storage.Queues;
using Azure.Storage.Queues.Models;
namespace ZerokaraStorageConsoleApp
{
internal class QueueSample
{
public async Task Execute()
{
// ストレージアカウント名
var storageAccountName = "zerokara";
// キュー名
var queueName = "zerokara-queue";
// キュークライアントの作成・・・①
var connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
QueueClient queueClient = new QueueClient(connectionString, queueName);
// キューの作成・・・②
await queueClient.CreateIfNotExistsAsync();
// メッセージをキューに追加する・・・③
await queueClient.SendMessageAsync("1st message.");
await queueClient.SendMessageAsync("2nd message.");
// キュー内のメッセージを取得する・・・④
QueueMessage[] messages = await queueClient.ReceiveMessagesAsync(maxMessages: 32);
foreach (var message in messages)
{
// メッセージの表示・・・⑤
Console.WriteLine($"メッセージの受信: {message.MessageText}");
// メッセージの削除・・・⑥
await queueClient.DeleteMessageAsync(message.MessageId, message.PopReceipt);
}
}
}
}
BLOBやFilesの場合と同様に、まずはストレージアカウント名とキュー名を引数にキュークライアントを作成します(①)。このキュークライアントを使いキューを作成します(②)。
キューを作成したら、キューにメッセージを追加することができます(③)。ここでは「SendMessageAsync」メソッドを使って2つのメッセージをキューに追加しています。追加されたキューは「ReceiveMessagesAsync」メソッドを使って取得することができます(④)。取得時に「maxMessages」という引数を指定することによって、取得するメッセージの上限数を指定することができます。
取得したメッセージのリストでforeachループを行い、⑤でメッセージをコンソール上に出力します。続けて、「DeleteMessageAsync」メソッドを使いメッセージをキューから削除します(⑥)。メッセージの削除には、メッセージのIDおよびポップレシートと呼ばれるメッセージの削除に必要なプロパティを引数に使用します。
「QueueSample.cs」を実装したら、呼び出し元になる「Program.cs」を編集します。
Program.csの編集
using ZerokaraStorageConsoleApp;
Console.WriteLine("===== BLOBのデモを開始します。 ===== ");
var blob = new BlobSample();
await blob.Execute();
Console.WriteLine("===== BLOBのデモが終了しました。 ===== ");
Console.WriteLine("===== Filesのデモを開始します。 ===== ");
var files = new FilesSample();
await files.Execute();
Console.WriteLine("===== Filesのデモが終了しました。 ===== ");
// Queueサンプルコードの実行を追加・・・①
Console.WriteLine("===== Queueのデモを開始します。 ===== ");
var queue = new QueueSample();
await queue.Execute();
Console.WriteLine("===== Queueのデモが終了しました。 ===== ");
BLOBおよびFilesの操作の後ろにQueueの操作のための実装を追加します(①)。この状態で再度アプリケーションを実行してみましょう。
実行後、Azureポータルからストレージアカウントを表示して左側のメニューから「キュー」を選択します。するとサンプルアプリで指定した名称のキューが存在することが確認できます。
キューを選択するとキュー内に現在存在するメッセージの一覧を確認することもできます。
ローカル開発に便利なAzuriteエミュレーター
ここまでAzure上に作成したストレージアカウントに接続してサンプルアプリケーションの実行を行ってきましたが、Azureでは「Azurite」と呼ばれるローカル開発向けのストレージアカウントのエミュレータが用意されています。
開発段階でストレージアカウントがAzure上にまだ用意されていなかったり、Azureの利用料金を抑える等の理由からAzuriteを使ってアプリケーションの開発を進めることも可能となっています。
ただし、Azuriteがエミュレートできるデータサービスは、BLOB、Queue、Tableの3種類で、Filesは未対応となっています。