Azure Blob Storage と Visual Studio 接続済みサービスの概要 (ASP.NET)

ヒント

Microsoft Azure ストレージ エクスプローラーを使用した Azure Blob Storage リソースの管理

Microsoft Azure ストレージ エクスプローラーは、Azure Blob Storage のリソースを管理できる Microsoft 製の無料のスタンドアロン アプリです。 Microsoft Azure ストレージ エクスプローラーを使用して、BLOB コンテナーおよび BLOB を視覚的に作成、読み取り、更新、削除できるほか、BLOB コンテナーおよび BLOB へのアクセスを管理できます。

概要

Azure Blob Storage は、非構造化データをクラウド内にオブジェクト/BLOB として格納するサービスです。 Blob Storage は、ドキュメント、メディア ファイル、アプリケーション インストーラーなど、任意の種類のテキスト データやバイナリ データを格納できます。 Blob Storage は、オブジェクト ストレージとも呼ばれます。

このチュートリアルでは、Azure Blob Storage を使用していくつかの一般的なシナリオの ASP.NET コードを記述する方法を示します。 シナリオには、BLOB コンテナーの作成や、BLOB のアップロード、一覧表示、ダウンロード、および削除が含まれます。

前提条件

BLOB ストレージとは

Azure Blob Storage は、HTTP または HTTPS 経由で世界中のどこからでもアクセスできるテキストやバイナリ データなど、大量の非構造化オブジェクト データを格納するためのサービスです。 BLOB ストレージを使用すると、データを一般に公開することも、アプリケーション データを公開せずに格納することもできます。

BLOB ストレージの一般的な用途には、次のようなものがあります。

  • 画像またはドキュメントをブラウザーに直接配信する
  • 分散アクセス用にファイルを格納する
  • ビデオおよびオーディオをストリーミング配信する
  • バックアップと復元、障害復旧、アーカイブのためのデータを格納する
  • 内部設置型サービスまたは Azure ホステッド サービスで分析する データを格納する

BLOB サービスの概念

BLOB サービスには、次のコンポーネントが含まれます。

BLOB アーキテクチャ

  • ストレージ アカウント : Azure Storage にアクセスする場合には必ず、ストレージ アカウントを使用します。 このストレージ アカウントは、汎用ストレージ アカウントにすることも、オブジェクト/BLOB の格納に特化した BLOB ストレージ アカウントにすることもできます。 詳細については、「Azure ストレージ アカウントについて」を参照してください。
  • コンテナー : コンテナーは、BLOB のセットをグループ化します。 すべての BLOB はコンテナーに格納されている必要があります。 1 つのアカウントに格納できるコンテナーの数は無制限です。 また、1 つのコンテナーに保存できる BLOB の数も無制限です。 コンテナー名は小文字で入力する必要があります。
  • BLOB : 任意の種類およびサイズのファイルです。 Azure ストレージが提供する BLOB には、ブロック BLOB とページ BLOB (ディスク)、追加 BLOB の 3 種類があります。

    ブロック BLOB は、ドキュメントやメディア ファイルなどのテキストまたはバイナリ ファイルを格納するのに最適です。 追加 BLOB はブロック BLOB と同様にブロックで構成されますが、追加操作用に最適化されているので、ログ記録シナリオで役立ちます。 1 つのブロック BLOB は、100 MB までのブロックを最大 50,000 個まで含めることができます。合計サイズは 4.75 TB を少し上回ります (100 MB x 50,000)。 1 つの追加 BLOB は、4 MB までのブロックを最大 50,000 個まで含めることができます。合計サイズは 195 GB を少し上回ります (4 MB x 50,000)。

    ページ BLOB は最大 1 TB のサイズにすることができます。読み取り/書き込み操作を頻繁に実行する場合はこの BLOB が効率的です。 Azure の仮想マシンでは、ページ BLOB を OS とデータ ディスクとして使用します。

    コンテナーと BLOB の名前付け規則については、「 コンテナー、BLOB、およびメタデータの名前付けおよび参照」を参照してください。

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

最初の Azure ストレージ アカウントを作成する最も簡単な方法は、 Azure ポータルを利用することです。 詳細については、「 ストレージ アカウントの作成」を参照してください。

Azure Storage アカウントは、Azure PowerShellAzure CLI、または .NET 用ストレージ リソース プロバイダー クライアント ライブラリを使用して作成することもできます。

開発環境を設定する

このセクションでは、ASP.NET MVC アプリの作成、接続済みサービスの接続の追加、コントローラーの追加、必要な名前空間ディレクティブの指定など、開発環境の設定方法について説明します。

ASP.NET MVC アプリ プロジェクトを作成する

  1. Visual Studio を開きます。

  2. メイン メニューで、[ファイル]、[新規作成]、[プロジェクト] の順に選択します。

  3. [新しいプロジェクト] ダイアログ ボックスで、次の図で強調表示されているようにオプションを指定します。

    ASP.NET プロジェクトの作成

  4. [OK]を選択します。

  5. [新しい ASP.NET プロジェクト] ダイアログ ボックスで、次の図で強調表示されているようにオプションを指定します。

    MVC の指定

  6. [OK]を選択します。

接続済みサービスを使用して Azure ストレージ アカウントに接続する

  1. ソリューション エクスプローラーでプロジェクトを右クリックし、コンテキスト メニューで [追加]、[接続済みサービス] の順に選択します。

  2. [接続済みサービスの追加] ダイアログで [Azure Storage] を選択し、[構成] を選択します。

    [接続済みサービス] ダイアログ

  3. [Azure Storage] ダイアログで目的の Azure ストレージ アカウントを選択し、[追加] を選択します。

MVC コントローラーを作成する

  1. ソリューション エクスプローラーコントローラーを右クリックし、コンテキスト メニューで [追加]、[コントローラー] の順に選択します。

    ASP.NET MVC アプリケーションへのコントローラーの追加

  2. [スキャフォールディングの追加] ダイアログ ボックスで [MVC 5 コントローラー - 空] を選択し、[追加] を選択します。

    MVC コントローラーの種類を指定する

  3. [コントローラーの追加] ダイアログで、コントローラーに BlobsController という名前を付けて、[追加] を選択します。

    MVC コントローラー指定

  4. 次の using ディレクティブを BlobsController.cs ファイルに追加します。

    using Microsoft.Azure;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Auth;
    using Microsoft.WindowsAzure.Storage.Blob;
    

BLOB コンテナーを作成する

BLOB コンテナーとは、BLOB とフォルダーの入れ子になった階層です。 次の手順では、BLOB コンテナーを作成する方法を説明します。

注意

このセクションのコードは、「開発環境を設定する」の手順を完了していることを前提にしています。

  1. BlobsController.cs ファイルを開きます。

  2. ActionResult を返す CreateBlobContainer というメソッドを追加します。

    public ActionResult CreateBlobContainer()
    {
        // The code in this section goes here.
    
        return View();
    }
    
  3. CreateBlobContainer メソッド内で、ストレージ アカウント情報を表す CloudStorageAccount オブジェクトを取得します。 次のコードを使用して、Azure サービス構成からストレージ接続文字列とストレージ アカウント情報を取得できます。 (<storage-account-name> はアクセスする Azure ストレージ アカウントの名前に変更します)。

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
       CloudConfigurationManager.GetSetting("<storage-account-name>_AzureStorageConnectionString"));
    
  4. BLOB サービス クライアントを表す CloudBlobClient オブジェクトを取得します。

    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    
  5. 目的の BLOB コンテナー名への参照を表す CloudBlobContainer オブジェクトを取得します。 CloudBlobClient.GetContainerReference メソッドでは、Blob Storage ストレージに対する要求は行われません。 BLOB コンテナーが存在するかどうかにかかわらず、参照が返されます。

    CloudBlobContainer container = blobClient.GetContainerReference("test-blob-container");
    
  6. まだない場合は、CloudBlobContainer.CreateIfNotExists メソッドを呼び出して、コンテナーを作成します。 CloudBlobContainer.CreateIfNotExists メソッドでは、コンテナーが存在せず、正常に作成された場合は true が返されます。 それ以外の場合は、false が返されます。

    ViewBag.Success = container.CreateIfNotExists();
    
  7. ViewBag を BLOB コンテナーの名前に変更します。

    ViewBag.BlobContainerName = container.Name;
    
  8. ソリューション エクスプローラー[ビュー] フォルダーを展開し、[BLOB] を右クリックし、コンテキスト メニューで [追加]、[ビュー] の順に選択します。

  9. [ビューの追加] ダイアログで、ビューの名前として CreateBlobContainer と入力し、[追加] を選択します。

  10. CreateBlobContainer.cshtml を開き、次のコード スニペットのように変更します。

    @{
        ViewBag.Title = "Create Blob Container";
    }
    
    <h2>Create Blob Container results</h2>
    
    Creation of @ViewBag.BlobContainerName @(ViewBag.Success == true ? "succeeded" : "failed")
    
  11. ソリューション エクスプローラーで、[ビュー]、[共有] フォルダーを順に展開し、_Layout.cshtml を開きます。

  12. 最後の Html.ActionLink の後に、次の Html.ActionLink を追加します。

    <li>@Html.ActionLink("Create blob container", "CreateBlobContainer", "Blobs")</li>
    
  13. アプリケーションを実行して [BLOB コンテナーの作成] を選択し、次のスクリーン ショットと同様の結果が表示されることを確認します。

    BLOB コンテナーを作成する

    前述したように、CloudBlobContainer.CreateIfNotExists メソッドは、コンテナーが存在しないため作成された場合にのみ true を返します。 そのため、コンテナーが存在するときにアプリを実行した場合、メソッドは false を返します。 アプリを複数回実行するには、アプリを再実行する前にコンテナーを削除する必要があります。 コンテナーを削除するには、CloudBlobContainer.Delete メソッドを使用します。 Azure Portal または Microsoft Azure ストレージ エクスプローラーを使用してコンテナーを削除することもできます。

BLOB コンテナーに BLOB をアップロードする

BLOB コンテナーを作成したら、そのコンテナーにファイルをアップロードできます。 このセクションでは、ローカル ファイルを BLOB コンテナーにアップロードする手順を説明します。 この手順では、test-blob-container という名前の BLOB コンテナーを作成していることを前提とします。

注意

このセクションのコードは、「開発環境を設定する」の手順を完了していることを前提にしています。

  1. BlobsController.cs ファイルを開きます。

  2. EmptyResult を返す UploadBlob というメソッドを追加します。

    public EmptyResult UploadBlob()
    {
        // The code in this section goes here.
    
        return new EmptyResult();
    }
    
  3. UploadBlob メソッド内で、ストレージ アカウント情報を表す CloudStorageAccount オブジェクトを取得します。 次のコードを使用して、Azure サービス構成からストレージ接続文字列とストレージ アカウントの情報を取得します (<storage-account-name> をアクセス対象の Azure ストレージ アカウントの名前に変更してください)。

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
       CloudConfigurationManager.GetSetting("<storage-account-name>_AzureStorageConnectionString"));
    
  4. BLOB サービス クライアントを表す CloudBlobClient オブジェクトを取得します。

    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    
  5. BLOB コンテナー名への参照を表す CloudBlobContainer オブジェクトを取得します。

    CloudBlobContainer container = blobClient.GetContainerReference("test-blob-container");
    
  6. 前述のように、Azure Storage ではさまざまな種類の BLOB がサポートされています。 ページ BLOB への参照を取得するには、CloudBlobContainer.GetPageBlobReference メソッドを呼び出します。 ブロック BLOB への参照を取得するには、CloudBlobContainer.GetBlockBlobReference メソッドを呼び出します。 通常は、ブロック BLOB を使用することをお勧めします。 (* を、アップロードされたときに BLOB に付ける名前に変更します)。

    CloudBlockBlob blob = container.GetBlockBlobReference(<blob-name>);
    
  7. BLOB の参照を取得したら、BLOB 参照オブジェクトの UploadFromStream メソッドを呼び出すことによって、データの任意のストリームを BLOB にアップロードできます。 UploadFromStream メソッドにより、BLOB が存在しない場合は作成され、存在する場合は上書きされます。 (<file-to-upload> を、アップロードするファイルへの完全修飾パスに変更します)

    using (var fileStream = System.IO.File.OpenRead(<file-to-upload>))
    {
        blob.UploadFromStream(fileStream);
    }
    
  8. ソリューション エクスプローラー[ビュー] フォルダーを展開し、[BLOB] を右クリックし、コンテキスト メニューで [追加]、[ビュー] の順に選択します。

  9. ソリューション エクスプローラーで、[ビュー]、[共有] フォルダーを順に展開し、_Layout.cshtml を開きます。

  10. 最後の Html.ActionLink の後に、次の Html.ActionLink を追加します。

    <li>@Html.ActionLink("Upload blob", "UploadBlob", "Blobs")</li>
    
  11. アプリケーションを実行し、[BLOB のアップロード] を選択します。

BLOB コンテナー内の BLOB を一覧表示する」セクションで、BLOB コンテナー内の BLOB を一覧表示する方法について説明します。

BLOB コンテナー内の BLOB を一覧表示する

このセクションでは、BLOB コンテナー内の BLOB を一覧表示する方法について説明します。 サンプル コードでは、セクション「BLOB コンテナーを作成する」で作成された test-blob-container を参照します。

注意

このセクションのコードは、「開発環境を設定する」の手順を完了していることを前提にしています。

  1. BlobsController.cs ファイルを開きます。

  2. ActionResult を返す ListBlobs というメソッドを追加します。

    public ActionResult ListBlobs()
    {
        // The code in this section goes here.
    
        return View();
    }
    
  3. ListBlobs メソッド内で、ストレージ アカウント情報を表す CloudStorageAccount オブジェクトを取得します。 次のコードを使用して、Azure サービス構成からストレージ接続文字列とストレージ アカウントの情報を取得します (<storage-account-name> をアクセス対象の Azure ストレージ アカウントの名前に変更してください)。

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
       CloudConfigurationManager.GetSetting("<storage-account-name>_AzureStorageConnectionString"));
    
  4. BLOB サービス クライアントを表す CloudBlobClient オブジェクトを取得します。

    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    
  5. BLOB コンテナー名への参照を表す CloudBlobContainer オブジェクトを取得します。

    CloudBlobContainer container = blobClient.GetContainerReference("test-blob-container");
    
  6. BLOB コンテナー内の BLOB を一覧表示するには、CloudBlobContainer.ListBlobs メソッドを使います。 CloudBlobContainer.ListBlobs メソッドは、CloudBlockBlobCloudPageBlob、または CloudBlobDirectory オブジェクトにキャストする IListBlobItem オブジェクトを返します。 次のコード スニペットでは、BLOB コンテナー内のすべての BLOB を列挙します。 各 BLOB がその型に基づいて適切なオブジェクトにキャストされ、その名前 (または、CloudBlobDirectory の場合は URI) が一覧に追加されます。

    List<string> blobs = new List<string>();
    
    foreach (IListBlobItem item in container.ListBlobs(null, false))
    {
        if (item.GetType() == typeof(CloudBlockBlob))
        {
            CloudBlockBlob blob = (CloudBlockBlob)item;
            blobs.Add(blob.Name);
        }
        else if (item.GetType() == typeof(CloudPageBlob))
        {
            CloudPageBlob blob = (CloudPageBlob)item;
            blobs.Add(blob.Name);
        }
        else if (item.GetType() == typeof(CloudBlobDirectory))
        {
            CloudBlobDirectory dir = (CloudBlobDirectory)item;
            blobs.Add(dir.Uri.ToString());
        }
    }
    
    return View(blobs);
    

    BLOB コンテナーには BLOB だけでなく、ディレクトリを含めることもできます。 次のような階層の test-blob-container いう BLOB コンテナーがあるとします。

     foo.png
     dir1/bar.png
     dir2/baz.png
    

    前のコード例を使用すると、BLOB 文字列リストには、次のような値が含まれます。

     foo.png
     <storage-account-url>/test-blob-container/dir1
     <storage-account-url>/test-blob-container/dir2
    

    ご覧のように、リストには最上位のエンティティのみが含まれ、入れ子になったエンティティ (bar.pngbaz.png) は含まれていません。 BLOB コンテナー内のすべてのエンティティを一覧表示するには、CloudBlobContainer.ListBlobs メソッドを呼び出して、useFlatBlobListing パラメーターに true を渡す必要があります。

    ...
    foreach (IListBlobItem item in container.ListBlobs(useFlatBlobListing:true))
    ...
    

    useFlatBlobListing パラメーターを true に設定すると、BLOB コンテナー内のすべてのエンティティのフラットな一覧が返され、次の結果が返されます。

     foo.png
     dir1/bar.png
     dir2/baz.png
    
  7. ソリューション エクスプローラー[ビュー] フォルダーを展開し、[BLOB] を右クリックし、コンテキスト メニューで [追加]、[ビュー] の順に選択します。

  8. [ビューの追加] ダイアログで、ビューの名前として ListBlobs と入力し、[追加] を選択します。

  9. ListBlobs.cshtml を開き、次のコード スニペットのように変更します。

    @model List<string>
    @{
        ViewBag.Title = "List blobs";
    }
    
    <h2>List blobs</h2>
    
    <ul>
        @foreach (var item in Model)
        {
        <li>@item</li>
        }
    </ul>
    
  10. ソリューション エクスプローラーで、[ビュー]、[共有] フォルダーを順に展開し、_Layout.cshtml を開きます。

  11. 最後の Html.ActionLink の後に、次の Html.ActionLink を追加します。

    <li>@Html.ActionLink("List blobs", "ListBlobs", "Blobs")</li>
    
  12. アプリケーションを実行して [List blobs (BLOB の一覧表示)] を選択し、次のスクリーン ショットと同様の結果が表示されることを確認します。

    BLOB の一覧

BLOB をダウンロードする

このセクションでは、BLOB をダウンロードし、ローカル ストレージに保存するか、または内容を文字列に読み込む方法を説明します。 サンプル コードでは、セクション「BLOB コンテナーを作成する」で作成された test-blob-container を参照します。

  1. BlobsController.cs ファイルを開きます。

  2. ActionResult を返す DownloadBlob というメソッドを追加します。

    public EmptyResult DownloadBlob()
    {
        // The code in this section goes here.
    
        return new EmptyResult();
    }
    
  3. DownloadBlob メソッド内で、ストレージ アカウント情報を表す CloudStorageAccount オブジェクトを取得します。 次のコードを使用して、Azure サービス構成からストレージ接続文字列とストレージ アカウントの情報を取得します (<storage-account-name> をアクセス対象の Azure ストレージ アカウントの名前に変更してください)。

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
       CloudConfigurationManager.GetSetting("<storage-account-name>_AzureStorageConnectionString"));
    
  4. BLOB サービス クライアントを表す CloudBlobClient オブジェクトを取得します。

    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    
  5. BLOB コンテナー名への参照を表す CloudBlobContainer オブジェクトを取得します。

    CloudBlobContainer container = blobClient.GetContainerReference("test-blob-container");
    
  6. CloudBlobContainer.GetBlockBlobReference または CloudBlobContainer.GetPageBlobReference メソッドを呼び出して、BLOB 参照オブジェクトを取得します。 (<blob-name> をダウンロードする BLOB の名前に変更します)

    CloudBlockBlob blob = container.GetBlockBlobReference(<blob-name>);
    
  7. BLOB をダウンロードするには、BLOB の種類に基づいて CloudBlockBlob.DownloadToStream または CloudPageBlob.DownloadToStream メソッドを使用します。 次のコード スニペットは、CloudBlockBlob.DownloadToStream メソッドを使用して、ローカル ファイルに保存されるストリーム オブジェクトに BLOB の内容を転送します (<local-file-name> を BLOB をダウンロードする場所を表す完全修飾ファイル名に変更します)。

    using (var fileStream = System.IO.File.OpenWrite(<local-file-name>))
    {
        blob.DownloadToStream(fileStream);
    }
    
  8. ソリューション エクスプローラーで、[ビュー]、[共有] フォルダーを順に展開し、_Layout.cshtml を開きます。

  9. 最後の Html.ActionLink の後に、次の Html.ActionLink を追加します。

    <li>@Html.ActionLink("Download blob", "DownloadBlob", "Blobs")</li>
    
  10. アプリケーションを実行し、[BLOB のダウンロード] を選択して、BLOB をダウンロードします。 CloudBlobContainer.GetBlockBlobReference メソッド呼び出しで指定された BLOB が、File.OpenWrite メソッド呼び出しで指定された場所にダウンロードされます。

BLOB を削除する

次の手順では、BLOB を削除する方法を説明します。

注意

このセクションのコードは、「開発環境を設定する」の手順を完了していることを前提にしています。

  1. BlobsController.cs ファイルを開きます。

  2. ActionResult を返す DeleteBlob というメソッドを追加します。

    public EmptyResult DeleteBlob()
    {
        // The code in this section goes here.
    
        return new EmptyResult();
    }
    
  3. ストレージ アカウント情報を表す CloudStorageAccount オブジェクトを取得します。 次のコードを使用して、Azure サービス構成からストレージ接続文字列とストレージ アカウントの情報を取得します (<storage-account-name> をアクセス対象の Azure ストレージ アカウントの名前に変更してください)。

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
       CloudConfigurationManager.GetSetting("<storage-account-name>_AzureStorageConnectionString"));
    
  4. BLOB サービス クライアントを表す CloudBlobClient オブジェクトを取得します。

    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    
  5. BLOB コンテナー名への参照を表す CloudBlobContainer オブジェクトを取得します。

    CloudBlobContainer container = blobClient.GetContainerReference("test-blob-container");
    
  6. CloudBlobContainer.GetBlockBlobReference または CloudBlobContainer.GetPageBlobReference メソッドを呼び出して、BLOB 参照オブジェクトを取得します。 (<blob-name> を、削除する BLOB の名前に変更します)

    CloudBlockBlob blob = container.GetBlockBlobReference(<blob-name>);
        ```
    
    
  7. To delete a blob, use the Delete method.

    blob.Delete();
    
  8. ソリューション エクスプローラーで、[ビュー]、[共有] フォルダーを順に展開し、_Layout.cshtml を開きます。

  9. 最後の Html.ActionLink の後に、次の Html.ActionLink を追加します。

    <li>@Html.ActionLink("Delete blob", "DeleteBlob", "Blobs")</li>
    
  10. アプリケーションを実行し、[BLOB の削除] を選択して、CloudBlobContainer.GetBlockBlobReference メソッド呼び出しで指定された BLOB を削除します。

次のステップ

Azure でデータを格納するための追加のオプションについては、他の機能ガイドも参照してください。