はじめに

今回はAzure上でデータを保存する仕組みの一つであるAzure Storageについて、サンプルを交えながら紹介します。

Azure Storageとは?

Azure Storageはさまざまな形式のデータを保存するための、Auzreが提供するクラウドストレージサービスです。
データはAzureのクラウド上に保存されるため、可用性が高くスケーラビリティや安全性に優れたストレージとして使用することができます。
Azure Storageではデータオブジェクトの形式に合わせてBLOB、Files、Tableといった名称でデータサービスが別れており、用途に応じてデータサービスを選択することができます。
またAzure StorageにはHTTPまたはHTTPS経由でどこからでもアクセスでき、.NET、Java、Python、JavaScript、C++、Goといった様々な言語用のSDKが用意されているため、アプリケーションからのデータの保存や参照も可能となっています。
以下は、Azure Storageの代表的なデータサービスです。

Azure BLOB

Azure BLOBはテキストデータや画像や動画、アプリケーションのようなバイナリデータなどの非構造化データをBLOB(Binary Large OBject)として格納することのできるオブジェクトストレージサービスです。冗長性やアクセス制御の設定が可能で、大容量のデータを保存するのに適しています。

  • Azure BLOBの構造

    Azure BLOBの構造

Azure BLOBを構成する要素には、ストレージアカウント、コンテナ、BLOBがあります。ストレージアカウントはAzure Storage上でストレージを識別するための名前空間です。ストレージアカウントには後述する他のデータサービスも含まれるため、1つのストレージアカウントで包括的にデータサービスを管理することができます。
コンテナはBLOBをグループ化しますが、様々な形式のデータを同じコンテナに格納することができます。BLOBは様々な種類とサイズのデータファイルで、Azure BLOBで提供されるBLOBにはブロックBLOB、追加BLOB、ページBLOBの3種類があります。
ブロックBLOBはテキストやバイナリファイルを格納するのに最適化されています。追加BLOBはブロックBLOBと同様にブロックとして構成されますが、追加操作に最適化されています。このため、ログなど追記が頻繁に発生する用途に適しています。ページBLOBは読み取りや書き込み操作を頻繁に実行する用途に最適化されています。

Azure Files

Azure FilesはSMB(サーバーメッセージブロック)およびNFS(ネットワークファイルシステム)プロトコルを使用してファイル共有を実現できるマネージドファイルストレージサービスです。オンプレミスのファイルサーバーと同様に、複数の仮想マシンやアプリケーションから同時にアクセスすることができます。

  • Azure Filesの構造

    Azure Filesの構造

Azure Filesを構成する要素には、ストレージアカウント、共有、ディレクトリ、ファイルがあります。共有とはAzure上でのSMBまたはNFS共有のことであり、一つのマウントポイントとなります。 Azure FilesとAzure BLOBは保存できるデータに共通点がありますが、用途としてAzure FilesはSMBやNFSによるファイル共有が行えるため、共有フォルダのようにアプリケーションに加え複数の人物が同時に利用する場合に有効です。Azure BLOBは主にアプリケーションによってデータの追加と参照を行う場合に適しています。

Azure Queue

Azure Queueはメッセージキューサービスで、主に分散型アプリケーションでのメッセージの連携に使用されます。アプリケーション間にメッセージキューを配置することで、メッセージの送信と受信によって非同期通信を可能にします。

  • Azure Queueの構造

    Azure Queueの構造

Azure Queueを構成する要素にはストレージアカウントとキュー、メッセージがあります。キューはメッセージを格納するオブジェクトで、キューに追加されたメッセージはFIFO(First In First Out)形式でキューから取り出すことができます。メッセージは形式を問わず、最大で64KBまでのデータを使用することができます。またメッセージがキューに保持される期間はデフォルトで7日間であり、それを超えるとシステム側で自動的に削除されます。設定を変更することで、期限切れにならないようにすることも可能です。

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

Azure Table

Azure TableはNoSQLデータベースサービスです。RDBMSに比べてスキーマの柔軟性があり、大量のデータを高速に処理することができるNoSQLデータベースの特長を持っています。

  • Azure Tableの構造

    Azure Tableの構造

Azure Tableを構成する要素には、ストレージアカウント、テーブル、エンティティが存在します。Azure TableではRDBMSのようにスキーマを設定する必要が無いため、同じテーブル内に、異なるプロパティを持つエンティティが含まれることを許容しています。エンティティはプロパティの集合体であり、1エンティティはRDBMSで言うところの1レコード(行)に相当します。
プロパティは名前と値のペアで、一つのエンティティに対して最大で252個のプロパティを含むことができます。またエンティティにはシステムで必要とされるParitionKey、RowKey、Timestampと呼ばれる3つのプロパティが含まれています。
Azure Tableでは、テーブルは複数のパーティションから構成されています。PartitionKeyはこのパーティションを識別するために利用されます。RowKeyはパーティション内のエンティティの一意識別子です。そのため、エンティティはPartitionKeyとRowKeyの組み合わせで一意とする必要があります。

ストレージアカウントを作成しよう

Azure Storageを利用するためには、まずストレージアカウントを作成する必要があります。今回はAzureポータルからストレージアカウントを作成する方法について説明します。

Azureポータルからストレージアカウントを作成する

まずはWebブラウザからAzureポータルにログインします。ログイン後、画面上部にある検索ボックスに「ストレージ」と入力して表示された「ストレージ アカウント」という項目を選択します。

  • Azureポータルからストレージアカウントのメニューを検索する

    Azureポータルからストレージアカウントのメニューを検索する

ストレージアカウントのトップ画面が表示されるので、画面左上の「作成」ボタンまたは画面下部の「ストレージ アカウントの作成」ボタンを選択します。

  • ストレージアカウントのトップ画面

    ストレージアカウントのトップ画面

ストレージアカウントの作成画面が表示されるので、内容を入力していきます。「基本」タブで入力する内容は以下の通りです。

ストレージアカウント作成時に入力する項目

項目名 内容
サブスクリプション Azureサービスの費用を負担する方式
リソースグループ Azureのリソースをひとまとめで管理するための単位
ストレージアカウント名 ストレージアカウントの名称。英小文字と数字のみで、3〜24文字で入力し、Azure内で一意である必要がある
地域 ストレージアカウントを配置するリージョン
パフォーマンス ストレージアカウントの種類(性能や使用できるストレージサービスが異なる)
冗長性 ストレージアカウントの耐久性や高可用性のレベル

「サブスクリプション」と「リソースグループ」は、既に作成済みのものがあればその中から任意のものを選択します。「ストレージアカウント名」にはストレージアカウントを識別するための分かりやすい名称を記入します。「地域」は任意で選択できますが、利用するクライアントと物理的に距離の近いリージョンを選択することでネットワークの遅延を軽減させることができます。
「パフォーマンス」は「Standard」か「Premiun」から選択可能です。「Standard」を選択した場合は、1つのストレージアカウントでBLOB、Queue、Files、Tableの4つのデータサービスを利用することができます。「Premium」を選択した場合は、高パフォーマンス化されているブロックBLOB、ページBLOB、ファイル共有の中の3つの選択肢の中からさらに1つを選択する必要があります。今回は「Standard」を選択します。
「冗長性」はストレージアカウントに保存するデータをどの程度冗長に保存するかを選択します。コストと必要な可用性レベルをトレードオフとして決定していきます。今回は「ローカル冗長ストレージ(LRS)」を選択します。その他の冗長性の種類については以下の表に記載しています。

冗長性の種類

冗長性名 説明
ローカル冗長ストレージ(LRS) リージョン内の1つの物理的な場所でデータを同期的に3回コピーする。最もコストの安い冗長性だが、可用性も最も低い
ゾーン冗長ストレージ(ZRS) リージョン内の3つの可用性ゾーン(データセンター)に分散してデータを同期的にコピーする。
geo冗長ストレージ(GRS) LRSに加え、セカンダリリージョン内の1つの物理的な場所でLRSを行う
geoゾーン冗長ストレージ(GZRS) ZRSに加え、セカンダリリージョン内の1つの物理的な場所でLRSを行う

以下の図は、基本タブで必要事項を入力した状態の例です。画面下部にある「レビュー」ボタンを選択して入力内容のチェックを行い、続いて「作成」ボタンを選択してストレージアカウントの作成を実行します。

  • ストレージアカウントの作成(基本タブ)

    ストレージアカウントの作成(基本タブ)

ストレージストレージの作成から少し待つと、リソースの作成が完了します。

ストレージ接続文字列の取得と設定

ストレージアカウントが作成できたら、アプリケーションからストレージアカウントに接続するために必要となる接続文字列を取得します。接続文字列にはストレージアカウントを認証するためのアクセスキーが含まれており、アプリケーションは接続文字列を使うことでアクセスキーによるストレージアカウントの認証を行うことができるようになっています。 Azureポータルで先程作成したストレージアカウントの画面を表示します。左側のメニューから「アクセス キー」を選択し、「key1」の接続文字列を表示してコピーします。なお、接続文字列は他者に知られないように管理してください。接続文字列が漏洩した可能性がある場合は、「アクセス キー」の画面内にある「キーの交換」からアクセスキーおよび接続文字列を更新することができます。

  • ストレージ接続文字列の取得

接続文字列をコピーしたら、環境変数に追加します。コマンドプロンプトを開き、「AZURE_STORAGE_CONNECTION_STRING」という環境変数名で接続文字列を登録します。

コマンドプロンプトで環境変数を設定する

setx AZURE_STORAGE_CONNECTION_STRING "ストレージ接続文字列"

このあと説明するアプリケーションの実装の中で、この環境変数から接続文字列を取得してストレージアカウントにアクセスをしていきます。

Azure Storageにアクセスするアプリケーションを実装しよう

ストレージアカウントが作成できたら、各データサービスにアクセスするサンプルアプリケーションの実装を行ってみましょう。今回はBLOBのデータサービスを操作するアプリケーションを.NETで実装する例について説明します。

.NETプロジェクトの作成

まずは.NETプロジェクトを作成します。Visual Studioを起動し「新しいプロジェクトの作成」を選択してプロジェクト作成ウィザードを表示します。

  • Visual Studioのウェルカム画面

    Visual Studioのウェルカム画面

画面上部の検索ボックスに「コンソール」と入力し、表示されるC#版の「コンソール アプリ」を選択して「次へ」ボタンを選択します。

  • 新しいプロジェクト作成ウィザード①

    新しいプロジェクト作成ウィザード①

新しいプロジェクトのプロジェクト名、ソリューション名、保存場所をそれぞれ任意の内容で入力して「次へ」ボタンを選択します。

  • 新しいプロジェクト作成ウィザード②

    新しいプロジェクト作成ウィザード②

使用する.NETのフレームワークバージョンの選択肢が表示されるので、最新バージョン(執筆時点では「.NET 8.0」)を選択します。最後に「作成」ボタンを選択するとプロジェクトが作成されます。

  • 新しいプロジェクト作成ウィザード③

    新しいプロジェクト作成ウィザード③

プロジェクトが作成されたら、依存ライブラリのインストールを行っていきます。

依存ライブラリのインストール

続いて、アプリケーションの実装に必要な依存ライブラリをインストールしていきます。以下の画像を参考に進めます。

  • NuGetによる依存ライブラリのインストール手順

    NuGetによる依存ライブラリのインストール手順

ソリューションエクスプローラーでプロジェクトを展開すると表示される「依存関係」という項目上で右クリックし、「NuGetパッケージの管理」という項目を選択します(画像内の①)。するとNuGetパッケージマネージャーの画面が表示されます。この画面で「参照」タブを選択し、その下にある検索ボックスに必要なライブラリ名である「Azure.Storage.Blobs」を入力します(画像内の②)。検索ワードにヒットしたライブラリが一覧表示されるので、その中から対象のライブラリを選択します(画像内の③)。ライブラリを選択するとその右側にライブラリの詳細情報が表示されるので、内容を確認して「インストール」ボタンを選択します(画像内の④)。インストールが開始されるとライブラリの利用に関する同意画面が表示されることがあるので、その場合は同意をしてインストールを進めます。

なお今回インストールする「Azure.Storage.Blobs」は、Azure BLOBを操作するAPIがまとめられたライブラリで、BLOBに関連するリソースの作成やファイルのアップロードやダウンロードといった操作を簡易に行うことができるようになります。このライブラリのインストールが完了したら、いよいよ実装に移ります。

BLOBのサンプルアプリケーションの実装

まずはBLOBを操作するアプリケーションを作成していきます。ソリューションエクスプローラーのプロジェクトの位置(ソリューションの1つ下)で右クリックして「追加」→「新しい項目」と選択して、ファイル名を「BlobSample.cs」として「追加」ボタンを選択します。

BLOBにアクセスするアプリケーション(BlobSample.cs)

using Azure.Storage.Blobs;

namespace ZerokaraStorageConsoleApp
{
    internal class BlobSample
    {
        public async Task Execute()
        {
            // ストレージアカウント名
            var storageAccountName = "zerokara";

            // BLOBサービスクライアントの作成・・・①
            var connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
            BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
            // BLOBコンテナの作成・・・②
            var containerName = "zerokara-container";
            BlobContainerClient containerClient =  blobServiceClient.GetBlobContainerClient(containerName);
            await containerClient.CreateIfNotExistsAsync();

            // ローカルフォルダの作成・・・③
            var localDir = "data";
            Directory.CreateDirectory(localDir);

            // ローカルにサンプルファイルを作成・・・④
            var fileName = $"sample{Guid.NewGuid()}.txt";
            var localFilePath = Path.Combine(localDir, fileName);
            await File.WriteAllTextAsync(localFilePath, "Hello, BLOB Storage!");

            // ファイルのアップロード・・・⑤
            BlobClient blobClient = containerClient.GetBlobClient(fileName);
            Console.WriteLine($"BLOBファイルをアップロードします。 BLOBのURI : {blobClient.Uri}");
            await blobClient.UploadAsync(localFilePath, true);

            // コンテナ内のBLOB一覧を表示・・・⑥
            Console.WriteLine("コンテナ内のBLOBのファイル名一覧を表示します。");
            await foreach (var item in containerClient.GetBlobsAsync())
            {
                Console.WriteLine(item.Name);
            }

            // ファイルのダウンロード・・・⑦
            var localDownloadFilePath = localFilePath.Replace(".txt", "DOWNLOADED.txt");
            await blobClient.DownloadToAsync(localDownloadFilePath);
            Console.WriteLine($"ファイルをダウンロードしました:{localDownloadFilePath}");
        }
    }
}

作成したC#のクラス内にメソッドを用意し、その中でストレージアカウントとコンテナの作成、BLOBファイルのアップロードとダウンロードを行っています。
まずはBLOB操作を行う上で必ず利用することとなるBLOBサービスクライアント(BlobServiceClient)のインスタンスを作成します(①)。BlobServiceClientの生成には、対象となるストレージアカウントの接続文字列を引数として使用します。接続文字列は先ほどの手順で環境変数に登録しているため、まずは環境変数から接続文字列を取得してBlobServiceClientのコンストラクタに渡します。
次に、①で生成したBlobServiceClientのインスタンスを使ってBLOBコンテナを作成します(②)。「blobServiceClient.GetBlobContainerClient(containerName)」でコンテナを操作することのできるコンテナクライアントを生成し、コンテナがストレージアカウントに存在しない場合はコンテナを作成するようにしています。
③〜⑤はBLOBファイルのアップロードの手順です。まずはアプリケーションを実行しているローカルマシン上にフォルダとアップロードするサンプルファイルを作成します(③、④)。②で生成したコンテナクライアントから新たにBLOBファイルを操作することのできるBLOBクライアントを生成して、サンプルファイルのアップロードを行います(⑤)。
⑥ではアップロードしたサンプルファイルが参照できるかどうかを確認します。「containerClient.GetBlobsAsync()」を使用することでコンテナ内に存在するBLOBファイルを取得することができるので、取得したファイルのファイル名をループで出力しています。
最後にダウンロードの確認です(⑦)。先程アップロードした際に使用したBLOBクライアントを使用して、ファイルをダウンロードします。ダウンロード時にファイル名が重複しないように、ファイル名を変更した上でダウンロードするようにしています。
「BlobSample.cs」の実装が完了したら、プロジェクト作成時に生成されている「Program.cs」を編集します。コンソールアプリケーションでは、Program.csを起点にアプリケーションが実行されるため、Program.csからBlobSample.csのメソッドを呼び出すようにします。

Program.csの編集

using ZerokaraStorageConsoleApp;

Console.WriteLine("===== BLOBのデモを開始します。 ===== ");

var blob = new BlobSample();
await blob.Execute();

Console.WriteLine("===== BLOBのデモが終了しました。 ===== ");

ここでは単純に「BlobSample」クラスをインスタンス化してExecuteメソッドを実行する実装となっています。

サンプルアプリケーションの実行

「BlobSample.cs」と「Program.cs」の実装が完了したらアプリケーションを実行してみましょう。Visual Studio上部にある実行ボタンをクリックすると、コンソールアプリケーションが実行されます。

  • アプリケーションの実行

    アプリケーションの実行

アプリケーションが実行されるとコマンドプロンプトが表示され、BLOBの操作内容が出力されます。

  • アプリケーションの実行結果

    アプリケーションの実行結果

図のような出力がされていれば成功です。Azure上のBLOBコンテナにファイルがアップロードされているかも確認してみましょう。Azureポータルでストレージアカウントを表示し、左側のメニューから「コンテナー」を選択します。

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら