Azuriteを使ってAzureStorageをエミュレートする

はじめに

Azure Storageに何かしらの操作を行うプログラムを書く際に、ローカル環境でプログラムを試したい場合がある。
今回は、公式で推奨しているAzuriteを利用してみる。

環境

Windows 11 Professional
Visual Studio 2022 Community
.NET 8
Azure.Storage.Blobs 12.22.2

Azuriteについては、Visual Studio 2022であれば、自動的に利用できるようだ。

Azurite は Visual Studio 2022 で自動的に使用できるようになります。 Azurite 実行可能ファイルは、Visual Studio の新しいバージョン リリースの一部として更新されます。 以前のバージョンの Visual Studio を実行している場合は、Node パッケージ マネージャー (npm) か DockerHub のいずれかを使用して、または Azurite GitHub リポジトリを複製して、Azurite をインストールできます。

今回作成したプロジェクトのGitHubリポジトリ

https://github.com/katsuobushiFPGA/AzureStorageSample

準備

Azure.Storage.Blobsをインストールする

  1. プロジェクトを右クリック、「NuGetパッケージの管理」を選択する
  2. Azure.Storage.Blobs」をインストールする
  3. インストール完了後、依存関係に 「Azure.Storage.Blobs」が入っていることを確認

Microsoft.Extensions.Configurationをインストールする

  1. プロジェクトを右クリック、「NuGetパッケージの管理」を選択する
  2. Microsoft.Extensions.Configuration」をインストールする
  3. インストール完了後、依存関係に 「Microsoft.Extensions.Configuration」が入っていることを確認

Microsoft.Extensions.Configuration.Jsonをインストールする

  1. プロジェクトを右クリック、「NuGetパッケージの管理」を選択する
  2. Microsoft.Extensions.Configuration.Json」をインストールする
  3. インストール完了後、依存関係に 「Microsoft.Extensions.Configuration.Json」が入っていることを確認

Microsoft.Extensions.DependencyInjectionをインストールする

  1. プロジェクトを右クリック、「NuGetパッケージの管理」を選択する
  2. Microsoft.Extensions.DependencyInjection」をインストールする
  3. インストール完了後、依存関係に 「Microsoft.Extensions.DependencyInjection」が入っていることを確認

Azuriteの実行

下記を参考に、Visual Studio 2022 Communityでエミュレータを実行する。
https://learn.microsoft.com/ja-jp/azure/storage/common/storage-use-azurite?tabs=visual-studio%2Cblob-storage

エミュレータの実行可能ファイルを確認する

C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator にある。

azurite-exe-01

azurite.exeがあることを確認したら次のステップにいく。

コマンド ラインからの Azurite の実行

管理者権限で実行する必要がある。

ターミナルを管理者権限で実行する。

azurite.exe --skipApiVersionCheck

で実行した。

azurite-exe-05

注意

※ユーザ権限で、ターミナルを開いてazurite.exeを実行するだと、権限が足りなくてエラーになる。 azurite-exe-02

console.log
PS C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator> .\azurite.exe
Azurite Blob service is starting at http://127.0.0.1:10000
Exit due to unhandled error: Error: EPERM: operation not permitted, open 'C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator\__azurite_db_blob__.json~'
PS C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator>

通常実行での注意

下記の場合、Azuriteのバージョンが古く、プログラムがエラーになる。
今回は、skipApiVersionCheck をフラグを付けて回避した。

  1. azurite.exeを右クリックして、管理者として実行を選択する。
azurite-exe-03

azurite-exe-04

実行されると、このような画面が出てくる。

補足: Azuriteのストレージ情報

項目設定値
DefaultEndpointsProtocolhttp
アカウント名(AccountName)devstoreaccount1
アカウント キー(AccountKey)Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==
BlobEndpointhttp://127.0.0.1:10000/devstoreaccount1
QueueEndpointhttp://127.0.0.1:10001/devstoreaccount1
TableEndpointhttp://127.0.0.1:10002/devstoreaccount1

サンプルのコンソールアプリの作成

以前、作成したようにコンソールアプリを作成する。
C#でLinux向けのコンソールアプリケーションを構築する#コンソールアプリケーションの作成 を参照する。

appsettings.jsonを作成

Azuriteに接続するための情報を記載した。

appsettings.json
{
    "ConnectionStrings": {
        "AzureStorageConnection": "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;"
    },
    "AzureStorage": {
        "ContainerName": "sample-container",
        "BlobSettings": {
            "PublicAccessLevel": "Blob"
        }
    },
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    }
}

AzureStorageContext.csの作成

Azureの接続情報を管理するファイル。
Context/AzureStorageContext.cs のパスで作成した。

Context/AzureStorageContext.cs
using Azure.Storage.Blobs;
using Microsoft.Extensions.Configuration;

namespace AzureStorageSample.Context
{
    public class AzureStorageContext
    {
        public BlobServiceClient BlobServiceClient { get; }

        public AzureStorageContext(IConfiguration configuration)
        {
            // appsettings.jsonから接続文字列を取得
            string connectionString = configuration.GetConnectionString("AzureStorageConnection");
            BlobServiceClient = new BlobServiceClient(connectionString);
        }

        public BlobContainerClient GetBlobContainerClient(string containerName)
        {
            return BlobServiceClient.GetBlobContainerClient(containerName);
        }
    }
}

Program.csの作成

Program.cs
using AzureStorageSample.Context;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace AzureStorageSample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 設定ファイルの読み込み
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .Build();

            // サービスプロバイダーの構築
            var serviceProvider = new ServiceCollection()
                .AddSingleton<IConfiguration>(configuration)
                .AddSingleton<AzureStorageContext>()
                .BuildServiceProvider();

            // サービスの取得
            var context = serviceProvider.GetService<AzureStorageContext>();
            var containerClient = context.GetBlobContainerClient("sample-container");

            // コンテナが存在しない場合は作成
            await containerClient.CreateIfNotExistsAsync();
            Console.WriteLine("コンテナ 'sample-container' を作成しました。");

            // Blob操作のサンプル
            string localFilePath = "sample.txt";
            await File.WriteAllTextAsync(localFilePath, "Hello, Azure Blob Storage!");
            string blobName = Path.GetFileName(localFilePath);

            // sample.txtをコンテナにアップロードする
            var blobClient = containerClient.GetBlobClient(blobName);
            await blobClient.UploadAsync(localFilePath, true);
            Console.WriteLine($"'{blobName}' をアップロードしました。");
        }
    }
}

実行結果の確認

azure-sample-01

ストレージの確認

Azure Storage Explorerをインストールし、実行する。

実行後、
エミュレータとアタッチ状態 > ストレージアカウント > (エミュレーター・既定のポート)(Key) > BLOBコンテナー を確認する。

下記の3点を確認する。

  • sample-containerがあること
  • sample-container 内に、 sample.txtがあること
  • sample.txtを右クリックでダウンロードし、中身がHello, Azure Blob Storage! であることを確認する。
azure-sample-02 azure-sample-02

問題ないのでOK!

参考

おわりに

Azure Storageに何かしらの操作を行うプログラムを書くということを実践した。
Azuriteというのを利用すればできることも知れたので良かった。
次回は、実際のAzureのBLOBストレージ にアップロードすることをやってみたい。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。