다음을 통해 공유


.NET Aspire Cosmos DB Entity Framework Core 통합

포함:호스팅 통합Client 통합

Azure Cosmos DB 최신 앱 개발을 위한 완전 관리형 NoSQL 데이터베이스 서비스입니다. .NET Aspire Cosmos DB Entity Framework Core 통합을 사용하면 기존 Cosmos DB 인스턴스에 연결하거나 Azure Cosmos DB 에뮬레이터를 사용하여 .NET 새 인스턴스를 만들 수 있습니다.

호스팅 통합

.NET .NET Aspire Azure Cosmos DB 호스팅 통합은 다양한 Cosmos DB 리소스를 다음과 같은 형식으로 모델화합니다.

이러한 형식 및 API를 표현하기 위해 액세스하려면 앱 호스트 프로젝트에서 📦Aspire.Hosting.Azure.CosmosDB NuGet 패키지를 추가합니다.

dotnet add package Aspire.Hosting.Azure.CosmosDB

자세한 내용은 dotnet add package 또는 .NET 응용 프로그램에서 패키지 종속성을 관리하기를 참조하십시오.

Azure Azure 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를 노출하여 데이터베이스 및 컨테이너를 추가합니다. 즉, 다른 Cosmos DB 리소스를 추가하기 전에 반드시 AzureCosmosDBResource을 추가해야 합니다.

중요하다

AddAzureCosmosDB호출할 때 암시적으로 AddAzureProvisioning호출합니다. 그러면 앱 시작 중에 Azure 리소스를 동적으로 생성하는 지원이 추가됩니다. 앱은 적절한 구독 및 위치를 구성해야 합니다. 자세한 내용은 로컬 프로비저닝: 구성참조하세요.

생성된 프로비저닝 Bicep

당신이 Bicep 을 처음 접하는 경우, 이는 Azure 리소스를 정의하기 위한 도메인별 언어입니다. .NET .NET Aspire사용하면 Bicep을 직접 작성할 필요가 없으며 프로비전 API는 Bicep을 생성합니다. 앱을 게시하면 생성된 Bicep이 매니페스트 파일과 함께 출력됩니다. Azure Azure Cosmos DB 리소스를 추가할 때, 다음과 같은 Bicep이 생성됩니다.


Azure Azure Cosmos DB Bicep 토글하기

@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 형식의 하위 클래스입니다. 이 형식을 사용하면 ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) API를 사용하여 Azure 리소스를 구성하는 흐름 API를 제공하여 생성된 Bicep을 사용자 지정할 수 있습니다. 예를 들어 kind, consistencyPolicy, locations등을 구성할 수 있습니다. 다음 예제에서는 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]약식입니다.

Azure Azure 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데이터베이스가 있도록 구성됩니다. 데이터베이스는 이전에 추가한 AzureCosmosDBResource이 나타내는 Cosmos DB 계정에 생성됩니다. 데이터베이스는 컬렉션 및 사용자에 대한 논리적 컨테이너입니다. 자세한 내용은 데이터베이스, 컨테이너 및 항목을 AzureAzure Cosmos DB에서 참조하세요.

메모

AddDatabase API를 사용하여 AzureAzure Cosmos DB 리소스에 데이터베이스를 추가하는 경우 에뮬레이터를 실행하는 경우 데이터베이스가 실제로 에뮬레이터에 만들어지지 않습니다. 이 API는 프로비저닝 인프라에서 생성된 Bicep에 데이터베이스를 포함하기 위한 것입니다.

Azure Azure 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 에뮬레이터. Azure Cosmos DB 에뮬레이터는 Azure Cosmos DB 앱을 테스트하기 위한 무료 로컬 환경을 제공하며 .NET AspireAzure 호스팅 통합에 완벽한 동반자입니다. 에뮬레이터는 설치되지 않았으며, 대신 .NET와.NET Aspire이 컨테이너로 접근할 수 있습니다. mcr.microsoft.com/cosmosdb/emulator 이미지와 함께 이전 예제와 같이 앱 호스트에 컨테이너를 추가하면 앱 호스트가 시작될 때 컨테이너가 만들어지고 시작됩니다. 자세한 내용은 컨테이너 리소스 수명 주기참조하세요.

Cosmos DB 에뮬레이터 컨테이너 구성

컨테이너 리소스에 사용할 수 있는 다양한 구성이 있습니다. 예를 들어 컨테이너의 포트, 환경 변수, 수명등을 구성할 수 있습니다.

Cosmos DB 에뮬레이터 컨테이너 게이트웨이 포트 구성

기본적으로 .NET Aspire에 의해 구성된 Cosmos DB 에뮬레이터 컨테이너는 다음 엔드포인트를 노출합니다.

끝점 컨테이너 포트 호스트 포트
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 에뮬레이터 컨테이너를 구성하려면 Cosmos DB 에뮬레이터 컨테이너 리소스에서 WithLifetime 메서드를 호출하고 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 에뮬레이터 리소스에 데이터 볼륨을 추가하려면 AzureAzure Cosmos DB 에뮬레이터 리소스에서 WithDataVolume 메서드를 호출합니다.

var builder = DistributedApplication.CreateBuilder(args);

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

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

데이터 볼륨은 컨테이너의 수명 주기 외부에서 Cosmos DB 에뮬레이터 데이터를 유지하는 데 사용됩니다. 데이터 볼륨은 Cosmos DB 에뮬레이터 컨테이너의 /tmp/cosmos/appdata 경로에 장착되고, 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가 실행 중인지와 연결이 설정될 수 있는지를 확인합니다.

호스팅 통합은 📦 AspNetCore.HealthChecks.CosmosDb NuGet 패키지에 의존합니다.

Client 통합

.NET Aspire Microsoft Entity Framework CoreCosmos DB 통합을 시작하려면 client.

dotnet add package Aspire.Microsoft.EntityFrameworkCore.Cosmos

Cosmos DB 컨텍스트를 추가하십시오.

client사용 중인 프로젝트의 Program.cs 파일에서 AddCosmosDbContext 확장 메서드를 호출하여, 종속성 주입 컨테이너에서 사용할 System.Data.Entity.DbContext을 등록합니다. 메서드는 연결 이름 매개 변수를 사용합니다.

builder.AddCosmosDbContext<MyDbContext>("cosmosdb");

connectionName 매개 변수는 앱 호스트 프로젝트에서 Cosmos DB 리소스를 추가할 때 사용되는 이름과 일치해야 합니다. 즉, AddAzureCosmosDB을 호출하고 cosmosdb 이름을 제공할 때, 동일한 이름을 AddCosmosDbContext을 호출하는 데 사용해야 합니다. 자세한 내용은 에서 AzureAzure Cosmos DB 리소스를로 추가하는 방법을 참조하세요.

그런 다음 종속성 주입을 사용하여 DbContext 인스턴스를 검색할 수 있습니다. 예를 들어 서비스에서 client 검색하려면 다음을 수행합니다.

public class ExampleService(MyDbContext context)
{
    // Use context...
}

더 많은 정보를 위해 에서 사용하는 방법은 NoSQL SDK의 예제를 참조하세요.

구성 / 설정

.NET Aspire Microsoft Entity Framework CoreCosmos DB 통합은 프로젝트의 요구 사항 및 규칙에 따라 Azure Cosmos DB 연결을 구성하는 여러 옵션을 제공합니다.

연결 문자열 사용

ConnectionStrings 구성 섹션에서 연결 문자열을 사용하는 경우 builder.AddCosmosDbContext호출할 때 연결 문자열의 이름을 제공할 수 있습니다.

builder.AddCosmosDbContext<MyDbContext>("CosmosConnection");

그런 다음 ConnectionStrings 구성 섹션에서 연결 문자열을 검색합니다.

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

자세한 내용은 ConnectionString 설명서을 참조하세요.

구성 공급자 사용

.NET Aspire Microsoft Entity Framework CoreCosmos DB 통합은 Microsoft.Extensions.Configuration지원합니다. appsettings.json같은 구성 파일에서 EntityFrameworkCoreCosmosSettings을 로드합니다. 예제 _appsettings.json 일부 옵션을 구성합니다.

{
  "Aspire": {
    "Microsoft": {
      "EntityFrameworkCore": {
        "Cosmos": {
          "DisableTracing": true
        }
      }
    }
  }
}

전체 Cosmos DBclient 통합 JSON 스키마는 Aspire참조하세요. Microsoft.EntityFrameworkCore.Cosmos/ConfigurationSchema.json.

인라인 대리자 사용

Action<EntityFrameworkCoreCosmosSettings> configureSettings 대리자를 전달하여 코드에서 추적을 사용하지 않도록 설정하는 등 일부 또는 모든 EntityFrameworkCoreCosmosSettings 옵션을 인라인으로 설정할 수도 있습니다.

builder.AddCosmosDbContext<MyDbContext>(
    "cosmosdb",
    settings => settings.DisableTracing = true);

통합 상태 검사 Client

기본적으로 .NET.NET Aspire 통합은 모든 서비스에 대한 상태 검사를 사용하도록 설정합니다. 자세한 내용은 .NET.NET Aspire 통합 개요참조하세요.

.NET Aspire Microsoft Entity Framework CoreCosmos DB 통합은 현재 상태 검사를 구현하지 않지만 이후 릴리스에서는 변경될 수 있습니다.

관찰 가능성 및 원격 분석

통합은 로깅, 추적 및 메트릭 구성을 자동으로 설정하며, 이를 관찰성의 핵심 요소라고도 합니다. 통합 관찰 가능성 및 원격 분석에 대한 자세한 내용은 .NET.NET Aspire 통합 개요참조하세요. 지원 서비스에 따라 일부 통합은 이러한 기능 중 일부만 지원할 수 있습니다. 예를 들어 일부 통합은 로깅 및 추적을 지원하지만 메트릭은 지원하지 않습니다. 구성 섹션에 제시된 기술을 사용하여 원격 분석 기능을 사용하지 않도록 설정할 수도 있습니다.

로깅

.NET Aspire Microsoft Entity Framework CoreCosmos DB 통합에서는 다음 로그 범주를 사용합니다.

  • Azure-Cosmos-Operation-Request-Diagnostics
  • Microsoft.EntityFrameworkCore.ChangeTracking
  • Microsoft.EntityFrameworkCore.Database.Command
  • Microsoft.EntityFrameworkCore.Infrastructure
  • Microsoft.EntityFrameworkCore.Query

추적

.NET Aspire Microsoft Entity Framework CoreCosmos DB 통합은 OpenTelemetry을 사용하여 다음 추적 활동을 실행한다.

  • Azure.Cosmos.Operation
  • OpenTelemetry.Instrumentation.EntityFrameworkCore

측정 지표

.NET Aspire Microsoft Entity Framework CoreCosmos DB 통합은 현재 다음 메트릭을 지원합니다.

  • Microsoft.EntityFrameworkCore
    • ec_Microsoft_EntityFrameworkCore_active_db_contexts
    • ec_Microsoft_EntityFrameworkCore_total_queries
    • ec_Microsoft_EntityFrameworkCore_queries_per_second
    • ec_Microsoft_EntityFrameworkCore_total_save_changes
    • ec_Microsoft_EntityFrameworkCore_save_changes_per_second
    • ec_Microsoft_EntityFrameworkCore_compiled_query_cache_hit_rate
    • ec_Microsoft_Entity_total_execution_strategy_operation_failures
    • ec_Microsoft_E_execution_strategy_operation_failures_per_second
    • ec_Microsoft_EntityFramew_total_optimistic_concurrency_failures
    • ec_Microsoft_EntityF_optimistic_concurrency_failures_per_second

참고 항목