Azure Cosmos DB for NoSQL SDK を使用して複数リージョンの書き込みアカウントに接続する

CosmosClientBuilder クラスは、コンテナーに接続して操作を実行する SDK クライアントをビルドするように設計されたフルーエント クラスです。 Azure Cosmos DB for NoSQL アカウントが複数リージョンの書き込み用に既に構成されている場合は、ビルダーを使用して、書き込み操作用に優先アプリケーション リージョンを構成できます。

このラボでは、リージョンが複数の Azure Cosmos DB for NoSQL アカウントを構成し、複数リージョンの書き込みを有効にします。 その後、SDK を使用して、特定のリージョンに対して操作を実行します。

開発環境を準備する

このラボで作業している環境に 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. [データをグローバルにレプリケートする] ペインで、さらに少なくとも 1 つのリージョンをアカウントに追加します。

  7. [データをグローバルにレプリケートする] ペインのまま、複数リージョンの書き込みを有効にしてから、変更内容を保存します。

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

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

  9. 作成した追加リージョンが少なくとも 1 つあることを確認します。 このリージョン値は、この演習で後ほど使用します。

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

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

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

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

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

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

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

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

  16. Visual Studio Code に戻ります。

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

新しく作成したアカウントの資格情報を使用して、SDK クラスに接続し、新しいデータベースとコンテナー インスタンスを作成します。 次に、データ エクスプローラーを使用して、Azure portal でインスタンスが存在することを検証します。

  1. [エクスプローラー] ペインで、22-sdk-multi-region フォルダーを参照します。

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

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

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

     dotnet build
    

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

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

  5. product.cs コード ファイルを開きます。

  6. Product レコードとその対応するプロパティを確認します。 具体的には、このラボでは idname、および categoryId プロパティを使用します。

  7. Visual Studio Code[エクスプローラー] ペインに戻り、script.cs コード ファイルを開きます。

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

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

     string endpoint = "<cosmos-endpoint>";
    

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

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

     string key = "<cosmos-key>";
    

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

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

SDK の書き込みリージョンを構成する

フルーエントな WithApplicationRegion メソッドを使用して、ビルダー クラスを使用して後続の操作の優先リージョンを構成します。

  1. コンストラクター パラメーターとして endpoint および key 変数を渡して、builder という名前の CosmosClientBuilder クラスの新しいインスタンスを作成します。

     CosmosClientBuilder builder = new (endpoint, key);
    
  2. ラボで先ほど作成した追加リージョンの名前を使用して、string 型の region という名前の新しい変数を作成します。 たとえば、米国東部リージョンに Azure Cosmos DB for NoSQL アカウントを作成し、その後ブラジル南部を追加した場合は、文字列変数に以下を含めます。

     string region = "Brazil South"; 
    

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

  3. WithApplicationRegion メソッドを region のパラメーターを指定して呼び出し、builder 変数で Build メソッドをフルーエントに呼び出し、using ステートメント内にカプセル化された CosmosClient 型の client という名前の変数に結果を格納します。

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

     Container container = client.GetContainer("cosmicworks", "products");
    
  5. 新しい Guid 値を生成し、idcategoryId という名前の 2 つの string 変数を作成し、結果を文字列として格納します。

     string id = $"{Guid.NewGuid()}";
     string categoryId = $"{Guid.NewGuid()}";
    
  6. コンストラクター パラメーターとして id 変数、Polished Bike Frame の文字列値、categoryId 変数を渡して、Product 型の item という名前の新しい変数を作成します。

     Product item = new (id, "Polished Bike Frame", categoryId);
    
  7. パラメーターとして item 変数を渡して、container 変数の CreateItemAsync<> メソッドを非同期に呼び出し、結果を response という名前の変数に格納します。

     var response = await container.CreateItemAsync<Product>(item);
    
  8. Console.WriteLine 静的メソッドを呼び出して、応答の HTTP 状態コードと要求料金 (要求ユニット単位) を出力します。

     Console.WriteLine($"Status Code:\t{response.StatusCode}");
     Console.WriteLine($"Charge (RU):\t{response.RequestCharge:0.00}");
    
  9. 完了すると、コード ファイルが次のようになるはずです。

     using Microsoft.Azure.Cosmos;
     using Microsoft.Azure.Cosmos.Fluent;
    
     string endpoint = "<cosmos-endpoint>";
     string key = "<cosmos-key>";    
    
     CosmosClientBuilder builder = new (endpoint, key);            
        
     string region = "West Europe";
        
     using CosmosClient client = builder
         .WithApplicationRegion(region)
         .Build();
        
     Container container = client.GetContainer("cosmicworks", "products");
        
     string id = $"{Guid.NewGuid()}";
     string categoryId = $"{Guid.NewGuid()}";
     Product item = new (id, "Polished Bike Frame", categoryId);
        
     var response = await container.CreateItemAsync<Product>(item);
        
     Console.WriteLine($"Status Code:\t{response.StatusCode}");
     Console.WriteLine($"Charge (RU):\t{response.RequestCharge:0.00}");
    
  10. script.cs コード ファイルを保存します。

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

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

     dotnet run
    
  13. ターミナルからの出力を確認します。 HTTP 状態コードと要求料金 (RU 単位) がコンソールに出力されているはずです。

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

  15. Visual Studio Code を閉じます。