Azure Cosmos DB for NoSQL SDK を使用してさまざまなリージョンに接続する

Azure Cosmos DB for NoSQL アカウントの geo 冗長性を有効にすると、SDK を使用して、構成した任意の順序でリージョンからデータを読み取ることができます。 この手法は、読み取り要求を、使用可能なすべての読み取りリージョンにわたって配布する場合に役立ちます。

このラボでは、手動で構成するフォールバックの順序で読み取りリージョンに接続するように CosmosClient クラスを構成します。

開発環境を準備する

このラボで作業している環境に DP-420 のラボ コードのリポジトリをまだクローンしていない場合は、次の手順に従ってクローンします。 それ以外の場合は、以前にクローンしたフォルダーを Visual Studio Code で開きます。

  1. Visual Studio Code を起動します。

    📝 Visual Studio Code インターフェイスについてまだよく理解していない場合は、作業の開始に関するドキュメントをご覧ください

  2. コマンド パレットを開き、Git: Clone を実行して、任意のローカル フォルダーに https://github.com/microsoftlearning/dp-420-cosmos-db-dev GitHub リポジトリをクローンします。

    💡 Ctrl + Shift + P キーボード ショートカットを使用してコマンド パレットを開くことができます。

  3. リポジトリが複製されたら、Visual Studio Code で選択したローカル フォルダーを開きます。

Azure Cosmos DB for NoSQL アカウントを作成する

Azure Cosmos DB は、複数の API をサポートするクラウドベースの NoSQL データベース サービスです。 Azure Cosmos DB アカウントを初めてプロビジョニングするときに、そのアカウントでサポートする API (たとえば、Mongo APINoSQL API) を選択します。 Azure Cosmos DB for NoSQL アカウントのプロビジョニングが完了したら、エンドポイントとキーを取得し、Azure SDK for .NET または任意の他の SDK を使用して Azure Cosmos DB for NoSQL アカウントに接続する際に使用できます。

  1. 新しい Web ブラウザー ウィンドウまたはタブで、Azure portal (portal.azure.com) に移動します。

  2. ご利用のサブスクリプションに関連付けられている Microsoft 資格情報を使用して、ポータルにサインインします。

  3. [+ リソースの作成] を選択し、Cosmos DB を検索して、新しい Azure Cosmos DB for NoSQL アカウント リソースを作成します。以下を設定して、残りの設定はすべて既定値のままにします。

    設定 Value
    サブスクリプション ’‘既存の Azure サブスクリプション’’
    リソース グループ ’‘既存のリソース グループを選択するか、新しいものを作成します’’
    アカウント名 ’‘グローバルに一意の名前を入力します’’
    場所 ’‘使用可能なリージョンを選びます’’
    容量モード プロビジョニング済みスループット
    Apply Free Tier Discount (Free レベル割引の適用) 適用しない

    📝 ご利用のラボ環境には、新しいリソース グループを作成できない制限が存在する場合があります。 その場合は、事前に作成されている既存のリソース グループを使用します。

  4. デプロイ タスクが完了するまで待ってから、このタスクを続行してください。

  5. 新しく作成した Azure Cosmos DB アカウント リソースにアクセスし、[データをグローバルにレプリケートする] ペインに移動します。

  6. [データをグローバルにレプリケートする] ペインで、アカウントにさらに 2 つの読み取りリージョンを追加し、変更内容を保存します。

  7. このタスクを続行する前に、レプリケーション タスクが完了するのを待ちます。

    📝 この操作には、5 から 10 分ほどかかる場合があります。

  8. 書き込み (プライマリ) リージョンと 2 つの読み取りリージョンの名前を記録します。 これらのリージョン名は、この演習で後ほど使用します。

    📝 たとえば、プライマリ リージョンが 北ヨーロッパで、2 つの読み取りセカンダリ リージョンが米国東部 2南アフリカ北部の場合は、この 3 つの名前をすべてそのまま記録します。

  9. リソース ブレードで、[データ エクスプローラー] ペインに移動します。

  10. [データ エクスプローラー] ペインで、 [新しいコンテナー] を選択します。

  11. [新しいコンテナー] ポップアップで、各設定に次の値を入力してから [OK] を選択します。

    設定 Value
    データベース ID 新規作成 | cosmicworks
    コンテナー間でスループットを共有する 選択しない
    コンテナー ID products
    パーティション キー /categoryId
    コンテナーのスループット 手動 | 400
  12. [データ エクスプローラー] ペインに戻り、cosmicworks データベース ノードを展開して、階層内の products コンテナー ノードを確認します。

  13. [データ エクスプローラー] ペインで、cosmicworksデータベース ノード、products コンテナー ノードの順に展開してから、[項目] を選択します。

  14. [データ エクスプローラー] ペインのまま、コマンド バーから [新しい項目] を選択します。 エディターで、プレースホルダーの JSON 項目を次の内容に置き換えます。

     {
       "id": "7d9273d9-5d91-404c-bb2d-126abb6e4833",
       "categoryId": "78d204a2-7d64-4f4a-ac29-9bfc437ae959",
       "categoryName": "Components, Pedals",
       "sku": "PD-R563",
       "name": "ML Road Pedal",
       "price": 62.09
     }
    
  15. コマンド バーから [保存] を選択して、JSON 項目を追加します。

  16. [項目] タブで、[項目] ペインの新しい項目を確認します。

  17. リソース ブレードで、[キー] ペインに移動します。

  18. このペインには、SDK からアカウントに接続するために必要な接続の詳細と資格情報が含まれています。 具体的な内容は次のとおりです。

    1. [URI] フィールドに注目します。 このエンドポイントの値は、この演習で後ほど使用します。

    2. [主キー] フィールドに注目してください。 このキーの値は、この演習で後ほど使用します。

  19. Visual Studio Code に戻ります。

SDK から Azure Cosmos DB for NoSQL アカウントに接続する

新しく作成したアカウントの資格情報を使用して、SDK クラスに接続し、異なるリージョンのデータベースとコンテナー インスタンスにアクセスします。

  1. [エクスプローラー] ウィンドウで、20-sdk-regions フォルダーを参照します。

  2. 20-sdk-regions フォルダーのコンテキスト メニューを開き、[統合ターミナルで開く] を選択して新しいターミナル インスタンスを開きます。

    📝 このコマンドを実行すると、ターミナルが開き、開始ディレクトリが既に 20-sdk-regions フォルダーに設定されています。

  3. dotnet build コマンドを使用してプロジェクトをビルドします。

     dotnet build
    

    📝 コンパイラから、endpoint および key 変数は現在使用されていないという警告が表示される場合があります。 これらの変数はこのタスクで使用しますので、この警告は無視しても問題ありません。

  4. 統合ターミナルを閉じます。

  5. 20-sdk-regions フォルダー内の script.cs コード ファイルを開きます。

    📝 [Microsoft.Azure.Cosmos][nuget.org/packages/microsoft.azure.cosmos/3.22.1] ライブラリは、既に NuGet から事前にインポートされています。

  6. endpoint という名前の string 変数を見つけます。 その値を、先ほど作成した Azure Cosmos DB アカウントのエンドポイントに設定します。

     string endpoint = "<cosmos-endpoint>";
    

    📝 たとえば、ご自分のエンドポイントが https­://dp420.documents.azure.com:443/ の場合、C# ステートメントは string endpoint = “https­://dp420.documents.azure.com:443/”; になります。

  7. key という名前の string 変数を見つけます。 その値を、先ほど作成した Azure Cosmos DB アカウントのキーに設定します。

     string key = "<cosmos-key>";
    

    📝 たとえば、キーが fDR2ci9QgkdkvERTQ== の場合、C# ステートメントは string key = “fDR2ci9QgkdkvERTQ==”; になります。

  8. script.cs コード ファイルを保存します。

優先リージョン リストを使用して .NET SDK を構成する

CosmosClientOptions クラスには、SDK を使用して接続するリージョンのリストを構成するためのプロパティが用意されています。 リストは、構成した順序で各リージョンへの接続を試行するように、フェールオーバー優先度順に並べます。

  1. List<string> ジェネリック型の新しい変数を作成して、アカウントで構成したリージョンのリストを 3 番目のリージョンから開始し、1 番目の (プライマリ) リージョンで終了するように含めます。 たとえば、米国西部リージョンに Azure Cosmos DB for NoSQL アカウントを作成し、次に南アフリカ北部を追加し、最後に東アジアを追加した場合、リスト変数は次のようにします。

     List<string> regions = new()
     {
         "East Asia",
         "South Africa North",
         "West US"
     };
    

    💡 代わりに、Microsoft.Azure.Cosmos.Regions 静的クラスを使用して、異なる Azure リージョンの組み込みの文字列プロパティを含めることもできます。

  2. options という名前の CosmosClientOptions クラスの新しいインスタンスを作成し、ApplicationPreferredRegions プロパティを region 変数に設定します。

     CosmosClientOptions options = new () 
     { 
         ApplicationPreferredRegions = regions
     };
    
  3. コンストラクター パラメーターとして endpointkey、および options 変数を渡して、client という名前の CosmosClient クラスの新しいインスタンスを作成します。

     using CosmosClient client = new (endpoint, key, options); 
    
  4. client 変数の GetContainer メソッドを使用し、データベースの名前 (cosmicworks) とコンテナーの名前 (products) を使って既存のコンテナーを取得します。

     Container container = client.GetContainer("cosmicworks", "products");
    
  5. container 変数の ReadItemAsync メソッドを使用して、サーバーから特定の項目を取得し、Null 許容の ItemResponse 型のresponse という名前の変数に結果を格納します。

     ItemResponse<dynamic> response = await container.ReadItemAsync<dynamic>(
         "7d9273d9-5d91-404c-bb2d-126abb6e4833",
         new PartitionKey("78d204a2-7d64-4f4a-ac29-9bfc437ae959")
     );
    
  6. Console.WriteLine 静的メソッドを呼び出して、現在の項目識別子と JSON 診断データを出力します。

     Console.WriteLine($"Item Id:\t{response.Resource.Id}");
     Console.WriteLine($"Response Diagnostics JSON");
     Console.WriteLine($"{response.Diagnostics}");
    
  7. 完了すると、コード ファイルが次のようになるはずです。

     using Microsoft.Azure.Cosmos;
    
     string endpoint = "<cosmos-endpoint>";
     string key = "<cosmos-key>";
    
     List<string> regions = new()
     {
         "<read-region-2>",
         "<read-region-1>",
         "<write-region>"
     };
        
     CosmosClientOptions options = new () 
     { 
         ApplicationPreferredRegions = regions
     };
        
     using CosmosClient client = new(endpoint, key, options);
        
     Container container = client.GetContainer("cosmicworks", "products");
        
     ItemResponse<dynamic> response = await container.ReadItemAsync<dynamic>(
         "7d9273d9-5d91-404c-bb2d-126abb6e4833",
         new PartitionKey("78d204a2-7d64-4f4a-ac29-9bfc437ae959")
     );
        
     Console.WriteLine($"Item Id:\t{response.Resource.Id}");
     Console.WriteLine("Response Diagnostics JSON");
     Console.WriteLine($"{response.Diagnostics}");
    
  8. script.cs コード ファイルを保存します。

  9. Visual Studio Code で、20-sdk-regions フォルダーのコンテキスト メニューを開き、[統合ターミナルで開く] を選択して新しいターミナル インスタンスを開きます。

  10. dotnet run コマンドを使用して、プロジェクトをビルドして実行します。

     dotnet run
    
  11. ターミナルからの出力を確認します。 コンソール出力にコンテナーの名前と JSON 診断データが出力されているはずです。

  12. JSON 診断データを確認します。 HttpResponseStats という名前のプロパティと RequestUri という名前の子プロパティを検索します。 このプロパティの値は、このラボで先ほど構成した名前とリージョンが含まれる URI のはずです。

    📝 たとえば、アカウント名が dp420 で、最初に構成したリージョンが東アジアの場合、JSON ロパティの値は、dp420-eastasia.documents.azure.com/dbs/cosmicworks/colls/products になります。

  13. 統合ターミナルを閉じます。

  14. Visual Studio Code を閉じます。