次の方法で共有


.NET Aspire Azure Cosmos DB 統合

含まれるもの:ホスティング統合Client 統合

Azure Cosmos DB は、最新のアプリ開発のためのフル マネージドの NoSQL データベース サービスです。 .NET Aspire Azure Cosmos DB 統合を使用すると、既存の Cosmos DB インスタンスに接続したり、.NET エミュレーターを使用して Azure Cosmos DB から新しいインスタンスを作成したりできます。

ホスティング統合

.NET .NET Aspire Azure Cosmos DB ホスティング統合は、さまざまな Cosmos DB リソースを次の種類としてモデル化します。

これらの型と API にアクセスして表現するには、📦Aspire.Hosting.Azure.CosmosDB. NuGet パッケージを アプリ ホスト プロジェクトに追加してください。

dotnet add package Aspire.Hosting.Azure.CosmosDB

詳細については、「dotnet パッケージ の追加」または「.NET アプリケーションでのパッケージの依存関係の管理」を参照してください。

リソース AzureAzure Cosmos DB 追加する

アプリ ホスト プロジェクトで、AddAzureCosmosDB を呼び出して、AzureAzure Cosmos DB リソース ビルダーを追加して返します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db");

// After adding all resources, run the app...

アプリ ホストに AzureCosmosDBResource を追加すると、データベースとコンテナーを追加するための他の便利な API が公開されます。 つまり、他の AzureCosmosDBResource リソースを追加する前に、Cosmos DB を追加する必要があります。

大事な

AddAzureCosmosDBを呼び出すと、暗黙的に AddAzureProvisioningが呼び出されます。これによって、アプリの起動時に Azure リソースを動的に生成するためのサポートが追加されます。 アプリは、適切なサブスクリプションと場所を構成する必要があります。 詳細については、「ローカル プロビジョニング: 構成」を参照してください。

生成されたプロビジョニング バイセップ

Bicepを初めて する場合は、 リソースを定義するためのドメイン固有の言語です。 .NET .NET Aspireでは、Bicep を手動で記述する必要はありません。代わりに、プロビジョニング API によって Bicep が生成されます。 アプリを発行すると、生成された Bicep がマニフェスト ファイルと共に出力されます。 Azure Azure Cosmos DB リソースを追加すると、次の Bicep が生成されます。


Azure Azure Cosmos DB 二頭筋を切り替えます。

@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location

param keyVaultName string

resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
  name: keyVaultName
}

resource cosmos 'Microsoft.DocumentDB/databaseAccounts@2024-08-15' = {
  name: take('cosmos-${uniqueString(resourceGroup().id)}', 44)
  location: location
  properties: {
    locations: [
      {
        locationName: location
        failoverPriority: 0
      }
    ]
    consistencyPolicy: {
      defaultConsistencyLevel: 'Session'
    }
    databaseAccountOfferType: 'Standard'
  }
  kind: 'GlobalDocumentDB'
  tags: {
    'aspire-resource-name': 'cosmos'
  }
}

resource connectionString 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
  name: 'connectionString'
  properties: {
    value: 'AccountEndpoint=${cosmos.properties.documentEndpoint};AccountKey=${cosmos.listKeys().primaryMasterKey}'
  }
  parent: keyVault
}

上記の Bicep は、次の既定値で AzureAzure Cosmos DB アカウントをプロビジョニングするモジュールです。

  • kind: Cosmos DBのアカウントの種類。 既定値は GlobalDocumentDBです。
  • consistencyPolicy: Cosmos DB アカウントの整合性ポリシー。 既定値は Sessionです。
  • locations: Cosmos DB アカウントの場所。 既定値はリソース グループの場所です。

Cosmos DB アカウントに加えて、Azure Key Vault リソースもプロビジョニングされます。 これは、Cosmos DB アカウントの接続文字列を安全に格納するために使用されます。 生成された Bicep は開始点であり、特定の要件を満たすようにカスタマイズできます。

プロビジョニング インフラストラクチャをカスタマイズする

すべての .NET AspireAzure リソースは、AzureProvisioningResource 型のサブクラスです。 この型は、生成された Bicep をカスタマイズするために、Azure API を利用して ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) リソースを構成するための fluent API を提供します。 たとえば、kindconsistencyPolicylocationsなどを構成できます。 次の例では、AzureAzure Cosmos DB リソースをカスタマイズする方法を示します。

builder.AddAzureCosmosDB("cosmos-db")
    .ConfigureInfrastructure(infra =>
    {
        var cosmosDbAccount = infra.GetProvisionableResources()
                                   .OfType<CosmosDBAccount>()
                                   .Single();

        cosmosDbAccount.Kind = CosmosDBAccountKind.MongoDB;
        cosmosDbAccount.ConsistencyPolicy = new()
        {
            DefaultConsistencyLevel = DefaultConsistencyLevel.Strong,
        };
        cosmosDbAccount.Tags.Add("ExampleKey", "Example value");
    });

上記のコード:

Azure Azure Cosmos DB リソースをカスタマイズするには、さらに多くの構成オプションを使用できます。 詳細については、Azure.Provisioning.CosmosDBを参照してください。 詳細については、Azureを参照してください。プロビジョニングのカスタマイズ

既存の AzureAzure Cosmos DB アカウントに接続する

接続する既存の AzureAzure Cosmos DB アカウントがある場合があります。 新しい AzureAzure Cosmos DB リソースを表す代わりに、接続文字列をアプリ ホストに追加できます。 既存の AzureAzure Cosmos DB アカウントに接続を追加するには、AddConnectionString メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddConnectionString("cosmos-db");

builder.AddProject<Projects.WebApplication>("web")
       .WithReference(cosmos);

// After adding all resources, run the app...

手記

接続文字列は、データベース接続、メッセージ ブローカー、エンドポイント URI、その他のサービスなど、さまざまな接続情報を表すために使用されます。 .NET .NET Aspire 命名法では、"接続文字列" という用語は、あらゆる種類の接続情報を表すために使用されます。

接続文字列は、アプリ ホストの構成 (通常は セクションの ConnectionStrings) で構成されます。 アプリ ホストは、この接続文字列を環境変数としてすべての依存リソースに挿入します。次に例を示します。

{
    "ConnectionStrings": {
        "cosmos-db": "AccountEndpoint=https://{account_name}.documents.azure.com:443/;AccountKey={account_key};"
    }
}

依存リソースは、GetConnectionString メソッドを呼び出し、接続名をパラメーターとして渡すことによって、挿入された接続文字列にアクセスできます(この場合 "cosmos-db"GetConnectionString API は、IConfiguration.GetSection("ConnectionStrings")[name]の短縮形です。

データベース リソース AzureAzure Cosmos DB 追加する

Azure Azure Cosmos DB データベース リソースを追加するには、IResourceBuilder<AzureCosmosDBResource> の呼び出しを AddDatabase API にチェーンします。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db")
                    .AddDatabase("db");

// After adding all resources, run the app...

AddDatabaseを呼び出すと、Cosmos DBという名前のデータベースを持つ db リソースが構成されます。 データベースは、先ほど追加した Cosmos DB によって表される AzureCosmosDBResource アカウントに作成されます。 データベースは、コレクションとユーザーの論理コンテナーです。 詳細については、の「データベース、コンテナー、および項目」を AzureAzure Cosmos DBで参照してください。

手記

AddDatabase API を使用してデータベースを AzureAzure Cosmos DB リソースに追加する場合、エミュレーターを実行している場合、データベースはエミュレーターで実際には作成されません。 この API は、プロビジョニング インフラストラクチャによって 生成された Bicep にデータベースを含めます。

エミュレーター リソース AzureAzure Cosmos DB 追加する

Azure Azure Cosmos DB エミュレーター リソースを追加するには、IResourceBuilder<AzureCosmosDBResource> の呼び出しを RunAsEmulator API にチェーンします。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db")
                    .RunAsEmulator();

// After adding all resources, run the app...

RunAsEmulatorを呼び出すと、エミュレーターを使用してローカルで実行するように Cosmos DB リソースが構成されます。 この場合のエミュレーターは、AzureAzure Cosmos DB Emulatorです。 Azure Cosmos DB Emulator は、Azure Cosmos DB アプリをテストするための無料のローカル環境を提供し、.NET AspireAzure ホスティング統合に最適です。 エミュレーターはインストールされていません。代わりに、コンテナーとして .NET.NET Aspire にアクセスできます。 前の例に示すように、mcr.microsoft.com/cosmosdb/emulator イメージでコンテナーをアプリ ホストに追加すると、アプリ ホストが起動したときにコンテナーが作成されて起動されます。 詳細については、「コンテナー リソースのライフサイクルの」を参照してください。

Cosmos DB エミュレーターコンテナーを構成する

コンテナー リソースで使用できるさまざまな構成があります。たとえば、コンテナーのポート、環境変数、有効期間などを構成できます。

エミュレーター コンテナー ゲートウェイ ポート Cosmos DB 構成する

既定では、Cosmos DBによって構成された .NET Aspire エミュレーター コンテナーは、次のエンドポイントを公開します。

エンドポイント コンテナー ポート ホスト ポート
https 8081 動的

リッスンしているポートは、既定では動的です。 コンテナーが起動すると、ポートはホスト コンピューター上のランダムなポートにマップされます。 エンドポイント ポートを構成するには、次の例に示すように、RunAsEmulator メソッドによって提供されるコンテナー リソース ビルダーの呼び出しをチェーンします。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
                     emulator =>
                     {
                         emulator.WithGatewayPort(7777);
                     });

// After adding all resources, run the app...

上記のコードは、ポート Cosmos DBでリッスンするように、https エミュレーター コンテナーの既存の 8081 エンドポイントを構成します。 Cosmos DB エミュレーター コンテナーのポートは、次の表に示すようにホスト ポートにマップされます。

エンドポイント名 ポート マッピング (container:host)
https 8081:7777
永続的なライフタイムを持つエミュレーター Cosmos DB コンテナを構成する

永続的な有効期間で Cosmos DB エミュレーター コンテナーを構成するには、WithLifetime エミュレーター コンテナー リソースで Cosmos DB メソッドを呼び出し、ContainerLifetime.Persistent渡します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
                     emulator =>
                     {
                         emulator.WithLifetime(ContainerLifetime.Persistent);
                     });

// After adding all resources, run the app...

詳細については、「コンテナー リソースの有効期間 」を参照してください。

データボリュームを使用してCosmos DBエミュレーターコンテナーを構成する

Azure Azure Cosmos DB エミュレーター リソースにデータ ボリュームを追加するには、WithDataVolumeAzure エミュレーター リソースで Azure Cosmos DB メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
                     emulator =>
                     {
                         emulator.WithDataVolume();
                     });

// After adding all resources, run the app...

データ ボリュームは、コンテナーのライフサイクル外に Cosmos DB エミュレーター データを保持するために使用されます。 データ ボリュームは、/tmp/cosmos/appdata エミュレーター コンテナーの Cosmos DB パスにマウントされ、name パラメーターが指定されていない場合は、名前が生成されます。 エミュレーターには、AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE 環境変数が trueに設定されています。 データ ボリュームの詳細と、バインド マウントよりも優先される理由の詳細については、「Docker ドキュメント: ボリューム」を参照してください。

Cosmos DB エミュレーター コンテナーのパーティション数を構成する

Cosmos DB エミュレーター コンテナーのパーティション数を構成するには、WithPartitionCount メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var cosmos = builder.AddAzureCosmosDB("cosmos-db").RunAsEmulator(
                     emulator =>
                     {
                         emulator.WithPartitionCount(100); // Defaults to 25
                     });

// After adding all resources, run the app...

上記のコードでは、Cosmos DBのパーティション数を持つ 100 エミュレーター コンテナーを構成します。 これは、AZURE_COSMOS_EMULATOR_PARTITION_COUNT 環境変数を設定するための短縮形です。

ホスティング統合の正常性チェック

Azure Cosmos DB ホスティング統合により、Cosmos DB リソースの正常性チェックが自動的に追加されます。 正常性チェックでは、Cosmos DB が実行されていることと、その Cosmos DB への接続を確立できることを確認します。

ホスティング統合は、📦 AspNetCore.HealthChecks.CosmosDb NuGet パッケージに依存します。

Client 統合

.NET Aspire Azure Cosmos DB クライアント統合を開始するには、📦AspireNuGet パッケージを、MicrosoftAzure.Cosmos クライアントを使用するプロジェクト、つまり Cosmos DB クライアントを使用するアプリケーションのプロジェクトにインストールします。 Cosmos DB クライアント統合では、Cosmos DBとの対話に使用できる CosmosClient インスタンスが登録されます。

dotnet add package Aspire.Microsoft.Azure.Cosmos

クライアント Cosmos DB 追加する

クライアントを使用するプロジェクトの Program.cs ファイルで、任意の IHostApplicationBuilderAddAzureCosmosClient 拡張メソッドを呼び出して、依存関係挿入コンテナーを介して使用する CosmosClient を登録します。 このメソッドは、接続名パラメーターを受け取ります。

builder.AddAzureCosmosClient(connectionName: "cosmos-db");

ヒント

connectionName パラメーターは、アプリ ホスト プロジェクトに Cosmos DB リソースを追加するときに使用する名前と一致する必要があります。 つまり、言い換えると、AddAzureCosmosDB を呼び出して cosmos-db という名前を指定した場合、その同じ名前を AddAzureCosmosClientを呼び出す際に使用する必要があるということです。 詳細については、「AzureAzure Cosmos DB リソース追加」を参照してください。

その後、依存関係の挿入を使用して CosmosClient インスタンスを取得できます。 たとえば、サービスの例から接続を取得するには、次のようにします。

public class ExampleService(CosmosClient client)
{
    // Use client...
}

依存関係の挿入の詳細については、.NET 依存関係の挿入を参照してください。

キー付き Cosmos DB クライアントを追加する

接続名が異なる複数の CosmosClient インスタンスを登録する場合があります。 キー付き Cosmos DB クライアントを登録するには、AddKeyedAzureCosmosClient メソッドを呼び出します。

builder.AddKeyedAzureCosmosClient(name: "mainDb");
builder.AddKeyedAzureCosmosClient(name: "loggingDb");

大事な

キー付きサービスを使用する場合、Cosmos DB リソースで、mainDb 用と loggingDb用の 2 つの名前付きデータベースが構成されている必要があります。

その後、依存関係の挿入を使用して CosmosClient インスタンスを取得できます。 たとえば、サービスの例から接続を取得するには、次のようにします。

public class ExampleService(
    [FromKeyedServices("mainDb")] CosmosClient mainDbClient,
    [FromKeyedServices("loggingDb")] CosmosClient loggingDbClient)
{
    // Use clients...
}

キー付きサービスの詳細については、「.NET 依存関係の挿入: キー付きサービスの」を参照してください。

構成

.NET Aspire Azure Cosmos DB 統合には、プロジェクトの要件と規則に基づいて接続を構成するための複数のオプションが用意されています。

接続文字列を使用する

ConnectionStrings 構成セクションの接続文字列を使用する場合は、AddAzureCosmosClient メソッドを呼び出すときに接続文字列の名前を指定できます。

builder.AddAzureCosmosClient("cosmos-db");

その後、接続文字列は ConnectionStrings 構成セクションから取得されます。

{
  "ConnectionStrings": {
    "cosmos-db": "AccountEndpoint=https://{account_name}.documents.azure.com:443/;AccountKey={account_key};"
  }
}

この接続文字列の書式を設定する方法の詳細については、ConnectionString のドキュメントを参照してください。

構成プロバイダーを使用する

.NET Aspire Azure Cosmos DB 統合では、Microsoft.Extensions.Configurationがサポートされます。 MicrosoftAzureCosmosSettings キーを使用して、構成から Aspire:Microsoft:Azure:Cosmos を読み込みます。 次のスニペットは、いくつかのオプションを構成する appsettings.json ファイルの例です。

{
  "Aspire": {
    "Microsoft": {
      "Azure": {
        "Cosmos": {
          "DisableTracing": false,
        }
      }
    }
  }
}

完全な Cosmos DB クライアント統合 JSON スキーマについては、Aspireを参照してください。Microsoft。Azure.Cosmos/ConfigurationSchema.json

インライン デリゲートを使用する

また、Action<MicrosoftAzureCosmosSettings> configureSettings デリゲートを渡して、コードからのトレースを無効にするなど、一部またはすべてのオプションをインラインで設定することもできます。

builder.AddAzureCosmosClient(
    "cosmos-db",
    static settings => settings.DisableTracing = true);

Microsoft.Azure.Cosmos.CosmosClientOptions メソッドの省略可能な Action<CosmosClientOptions> configureClientOptions パラメーターを使用して、AddAzureCosmosClient を設定することもできます。 たとえば、このクライアントによって発生するすべての要求の問題に対して、CosmosClientOptions.ApplicationName ユーザー エージェント ヘッダー サフィックスを設定するには、次のようにします。

builder.AddAzureCosmosClient(
    "cosmosConnectionName",
    configureClientOptions:
        clientOptions => clientOptions.ApplicationName = "myapp");

Client 統合ヘルスチェック

既定では、.NET.NET Aspire 統合により、すべてのサービスの正常性チェックが有効になります。 詳細については、.NET.NET Aspire 統合の概要を参照してください。

.NET Aspire Azure Cosmos DB 統合:

  • MicrosoftAzureCosmosSettings.DisableTracingfalseされたときに正常性チェックを追加し、Cosmos DBへの接続を試みます。
  • /health HTTP エンドポイントと統合されます。このエンドポイントは、アプリがトラフィックを受け入れる準備ができていると見なされるために、登録されているすべての正常性チェックに合格する必要があります。

可観測性とテレメトリ

統合により、ログ記録、トレース、メトリックの構成が自動的に設定されます。これは、監視の柱 とも呼ばれます。 統合の可観測性とテレメトリの詳細については、統合の概要 参照してください。 バッキング サービスによっては、一部の統合でこれらの機能の一部のみがサポートされる場合があります。 たとえば、一部の統合ではログ記録とトレースがサポートされますが、メトリックはサポートされません。 テレメトリ機能は、「構成」セクションに記載されている手法を使用して無効にすることもできます。

伐採

.NET Aspire Azure Cosmos DB 統合では、次のログ カテゴリが使用されます。

  • Azure-Cosmos-Operation-Request-Diagnostics

失敗した要求の Azure Cosmos DB 要求診断を取得するだけでなく、待機時間のしきい値を構成して、成功した Azure Cosmos DB 要求診断をログに記録するかを決定できます。 既定値は、ポイント操作の場合は 100 ミリ秒、非ポイント操作の場合は 500 ミリ秒です。

builder.AddAzureCosmosClient(
    "cosmosConnectionName",
    configureClientOptions:
        clientOptions => {
            clientOptions.CosmosClientTelemetryOptions = new()
            {
                CosmosThresholdOptions = new()
                {
                    PointOperationLatencyThreshold = TimeSpan.FromMilliseconds(50),
                    NonPointOperationLatencyThreshold = TimeSpan.FromMilliseconds(300)
                }
            };
        });

トレーシング

.NET Aspire Azure Cosmos DB 統合では、OpenTelemetryを使用して次のトレース アクティビティが出力されます。

  • Azure.Cosmos.Operation

Azure Azure Cosmos DB トレースは現在プレビュー段階であるため、トレースが確実に出力されるように試験段階のスイッチを設定する必要があります。

AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", true);

詳細については、「AzureAzure Cosmos DB SDK の可観測性: トレース属性」を参照してください。

メトリック

.NET Aspire Azure Cosmos DB 統合は現在、Azure SDK の制限により、既定ではメトリックをサポートしていません。

関連項目