はじめに
今回は前回に引き続き、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は未対応となっています。
Azuriteエミュレーターのインストール
AzuriteエミュレーターはVisual Studio 2022を使用している場合は、Visual Studioのツールの一部として既にインストールされています。以下はVisual StudioのエディションごとのAzuriteの実行可能ファイルの配置場所です。
Azurite実行可能ファイルの配置場所
Visual Studioのエディション | 配置場所 |
---|---|
Visual Studio Community 2022 | C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator |
Visual Studio Professional 2022 | C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator |
Visual Studio Enterprise 2022 | C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator |
上記の配置場所にある「azurite.exe」という実行可能ファイルがAzuriteエミュレーターです。
またVisual Studioを利用していない場合は、各種ツールでのAzuriteのインストールがサポートされています。詳細はMicrosoftのドキュメントを参照してください。
Azuriteエミュレーターの起動
Azuriteエミュレーターはコマンドプロンプトから起動します。コマンドプロンプトを起動し以下のコマンドを実行します。 なお、権限によっては起動に失敗する場合があるので、その場合は管理者権限でコマンドプロンプトを起動してください。
コマンドプロンプトからAzuriteを起動する
cd C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator
azurite.exe --skipApiVersionCheck
cdコマンドで移動する場所は、前述の「Azurite実行可能ファイルの配置場所」の表を参考にお使いのエディションに合ったものに置き換えてください。
「azurite.exe」コマンドを実行することでAzuriteエミュレーターがローカルマシン上で起動します。コマンドのオプションとして「--skipApiVersionCheck」を付与していますが、これはアプリケーションがAzuriteにアクセスした際にAPIのバージョンチェックを行った際に発生する可能性のあるエラーを無視するためのオプションです。
Azure Storage Explorerのインストールと起動
Azuriteエミュレーター上のデータを確認するには、Azure Storage Explorerというツールを利用すると便利です。これはAzuriteエミュレーターやAzure上のストレージアカウントのデータをGUIでまとめて確認することのできるツールです。 [Azure Storage Explorerのインストールページからインストーラーをダウンロードすることができます。
インストーラーに従ってインストール後、Azure Storage Explorerを起動します。画面左側に表示されている「エクスプローラー」領域内の「ストレージアカウント」という部分を展開すると、「(エミューレーター - 規定のポート)」という名称の項目があります。これがAzuriteエミュレーター内のデータを表示するための項目となります。Azuriteエミューレーターを起動している状態でさらにこの項目を展開すると、BLOB、Queue、Tableのアイコンが表示されます。
この項目を選択していると、画面左下の「プロパティ」にAzuriteエミュレーターの各種情報が表示されます。その中の「プライマリ接続文字列」という項目が、Azuriteエミュレーター用の接続文字列となっています。
「BlobSample.cs」や「QueueSample.cs」のコードにある「connectionString」変数の値をこの接続文字列に書き換えると、アプリはAzuriteエミュレーターと接続してデータの操作を行うようになります。
接続文字列の編集(BlobSample.cs、QueueSample.cs)
// var connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
// 以下に置き換える
var connectionString = "<Azure Storage Explorerに表示されているプライマリ接続文字列>";
このように「connectionString」を書き換えた上でサンプルアプリケーションを実行してみましょう。実行後、Azure Storage Explorerでエクスプローラー領域にある「すべて更新」ボタンで最新情報に更新すると、Azuriteエミュレーター内のBlobおよびQueueにデータが追加されていることを確認することができます。
このようにAzuriteエミュレーターを利用すると、アプリケーションの開発からAzure Storageのデータの操作までをAzureのクラウドを介さずにローカル環境で完結して行うことができるようになります。
まとめ
今回はAzure StorageのうちFilesとQueueのサンプルアプリケーションの実装方法と、ローカル環境で使用することのできるAzuriteエミュレーターについて紹介しました。次回はAzure Tableについて紹介する予定です。
WINGSプロジェクト 秋葉龍一(著) 山田 祥寛(監修)
有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。現在も執筆メンバーを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。
RSS
X:@WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト)