チュートリアル:Blob Storage を使用して高可用性アプリケーションを作成する

このチュートリアルは、シリーズの第 1 部です。 ここでは、Azure でアプリケーション データを高可用にする方法について学習します。

このチュートリアルを完了すると、BLOB を読み取りアクセス geo ゾーン冗長 (RA-GZRS) ストレージ アカウントにアップロードし、取得するコンソール アプリケーションが作成されます。

Azure Storage の geo 冗長では、プライマリ リージョンから何百キロも離れたセカンダリ リージョンにトランザクションが非同期にレプリケートされます。 このレプリケーション プロセスにより、セカンダリ リージョンのデータの結果整合性が保証されます。 コンソール アプリケーションでは、サーキット ブレーカー パターンを使用して、接続先のエンドポイントを判断し、障害と復旧がシミュレートされたときに自動的にエンドポイント間を切り替えます。

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

シリーズの第 1 部で学習する内容は次のとおりです。

  • ストレージ アカウントの作成
  • 接続文字列の設定
  • コンソール アプリケーションを実行する

前提条件

このチュートリアルを完了するには、以下が必要です。

  • Azure 開発ワークロードと共に Visual Studio 2022 をインストールします。

    Screenshot of Visual Studio Azure development workload (under Web & Cloud).

Azure portal にサインインする

Azure portal にサインインします。

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

ストレージ アカウントは、Azure Storage データ オブジェクトを格納してアクセスするための一意の名前空間を提供します。

次の手順で、読み取りアクセス geo ゾーン冗長 (RA-GZRS) ストレージ アカウントを作成します。

  1. Azure portal で、 [リソースの作成] ボタンを選択します。

  2. [新規] ページの [ストレージ アカウント - Blob、File、Table、Queue] を選択します。

  3. 下図のように、ストレージ アカウント フォームに次の情報を入力し、 [作成] を選択します。

    設定 値の例 説明
    サブスクリプション My subscription サブスクリプションの詳細については、サブスクリプションに関するページを参照してください。
    ResourceGroup myResourceGroup 有効なリソース グループ名については、名前付け規則と制限に関するページを参照してください。
    名前 mystorageaccount ストレージ アカウントの一意の名前。
    場所 米国東部 場所を選択します。
    パフォーマンス Standard この例のシナリオには Standard パフォーマンスが適しています。
    アカウントの種類 StorageV2 汎用 v2 ストレージ アカウントの使用をお勧めします。 Azure Storage アカウントの種類について詳しくは、「ストレージ アカウントの概要」を参照してください。
    レプリケーション 読み取りアクセス geo ゾーン冗長ストレージ (RA-GZRS) プライマリ リージョンはゾーン冗長で、セカンダリ リージョンにレプリケートされます。セカンダリ リージョンへの読み取りアクセスが有効となります。
    アクセス層 ホット アクセスされる頻度の高いデータにはホット層を使用します。

    create storage account

サンプルのダウンロード

サンプル プロジェクトをダウンロードし、storage-dotnet-circuit-breaker-pattern-ha-apps-using-ra-grs.zip ファイルを抽出 (解凍) してから、v12 フォルダーに移動してプロジェクト ファイルを見つけます。

git を使用して、リポジトリをローカル開発環境にクローンすることもできます。 v12 フォルダー内のサンプル プロジェクトには、コンソール アプリケーションが含まれています。

git clone https://github.com/Azure-Samples/storage-dotnet-circuit-breaker-pattern-ha-apps-using-ra-grs.git

サンプルの構成

Azure Blob Storage に対するアプリケーション要求は、認可されている必要があります。 Azure.Identity クライアント ライブラリによって提供される DefaultAzureCredential クラスを使用するのが、コードで Azure サービスに接続するために推奨される方法です。 .NET v12 コード サンプルでは、この方法を使用します。 詳細については、DefaultAzureCredential の概要に関するページを参照してください。

アカウント アクセス キーを使用して、Azure Blob Storage への要求を認可することもできます。 ただし、この方法は、アクセス キーが公開されないように注意して使用する必要があります。

コンソール アプリケーションを実行する

Visual Studio で F5 キーを押すか [スタート] を選択してアプリケーションのデバッグを開始します。 パッケージの復元が構成されている場合、Visual Studio は不足している NuGet パッケージを自動的に復元します。 詳細については、パッケージの復元によるパッケージのインストールと再インストールに関するセクションを参照してください。

コンソール ウィンドウが起動すると、アプリはセカンダリ リージョンの状態を取得し、その情報をコンソールに書き込みます。 その後、アプリによってストレージ アカウントにコンテナーが作成され、BLOB がコンテナーにアップロードされます。 BLOB がアップロードされると、アプリは BLOB がセカンダリ リージョンにレプリケートされたかどうかを継続的に確認します。 この確認は、BLOB がレプリケートされるか、ループ条件で定義されている最大反復回数に達するまで続行されます。

次に、アプリケーションは、BLOB をダウンロードするように求めるプロンプトを表示してループに入ります。最初はプライマリ ストレージから読み取ります。 任意のキーを押して BLOB をダウンロードします。 プライマリ リージョンからの読み取りで再試行可能なエラーが発生した場合は、セカンダリ リージョン エンドポイントに対して読み取り要求の再試行が実行されます。 リージョンがセカンダリに切り替わると、そのことがコンソール出力で表示されます。

Screenshot of Console output for secondary request.

ループを終了してリソースをクリーンアップするには、BLOB のダウンロードのプロンプトで Esc キーを押します。

サンプル コードを理解する

このサンプルでは、再試行オプションとセカンダリ リージョン エンドポイントが構成された BlobServiceClient オブジェクトを作成しています。 この構成により、プライマリ リージョン エンドポイントで要求が失敗した場合に、アプリケーションはセカンダリ リージョンに自動的に切り替えることができます。

string accountName = "<YOURSTORAGEACCOUNTNAME>";
Uri primaryAccountUri = new Uri($"https://{accountName}.blob.core.windows.net/");
Uri secondaryAccountUri = new Uri($"https://{accountName}-secondary.blob.core.windows.net/");

// Provide the client configuration options for connecting to Azure Blob storage
BlobClientOptions blobClientOptions = new BlobClientOptions()
{
    Retry = {
        // The delay between retry attempts for a fixed approach or the delay
        // on which to base calculations for a backoff-based approach
        Delay = TimeSpan.FromSeconds(2),

        // The maximum number of retry attempts before giving up
        MaxRetries = 5,

        // The approach to use for calculating retry delays
        Mode = RetryMode.Exponential,

        // The maximum permissible delay between retry attempts
        MaxDelay = TimeSpan.FromSeconds(10)
    },

    // Secondary region endpoint
    GeoRedundantSecondaryUri = secondaryAccountUri
};

// Create a BlobServiceClient object using the configuration options above
BlobServiceClient blobServiceClient = new BlobServiceClient(primaryAccountUri, new DefaultAzureCredential(), blobClientOptions);

GeoRedundantSecondaryUri プロパティが BlobClientOptions で設定されている場合、GET または HEAD 要求の再試行により、セカンダリ エンドポイントを使用するように切り替わります。 その後の再試行では、プライマリとセカンダリ エンドポイントの間で交互に切り替わります。 ただし、セカンダリ URI からの応答の状態が 404 の場合、このエラー コードはリソースがセカンダリ リージョンにレプリケートされていないことを示しているので、要求の後続の再試行ではセカンダリ URI は使用されなくなります。

次のステップ

シリーズの第 1 部では、RA-GZRS ストレージ アカウントでアプリケーションを高可用にする方法について学習しました。

シリーズの第 2 部に進んで、エラーをシミュレートし、アプリケーションがセカンダリ RA-GZRS エンドポイントを使用するように強制する方法について学んでください。

リソース

非推奨の SDK を使用した関連コード サンプルについては、次のリソースを参照してください。