.NET Aspire 매니페스트를 사용하여 연결 문자열 사용자 지정

완료됨

Visual Studio나 Azure Developer CLI와 같은 배포 도구는 .NET Aspire 솔루션의 콘텐츠를 설명하는 매니페스트 파일을 만듭니다. 배포를 사용자 지정하려면 매니페스트 파일을 직접 변경할 수 있습니다.

야외 장비 판매점에서 웹앱 마이크로 서비스에 대한 출력 캐시를 호스팅하기 위해 기존 Azure Cache for Redis 인스턴스를 사용하기로 결정했습니다. 웹앱 서비스가 Azure Cache for Redis의 올바른 인스턴스에 연결되는지 확인해야 합니다.

이 단원에서는 .NET Aspire 매니페스트 파일에서 백업 서비스에 대한 연결 문자열을 변경하는 방법을 알아봅니다.

.NET CLI를 사용하여 매니페스트 파일 생성

로컬 개발 및 디버깅 중에 .NET Aspire는 매니페스트 파일을 만들지 않습니다. 배포와 관련해 .NET은 마이크로 서비스, 백업 서비스, 구성을 포함한 .NET Aspire 솔루션의 콘텐츠를 설명해야 합니다. 매니페스트 파일은 이러한 목적을 위해 사용됩니다. JSON 형식으로 솔루션을 설명합니다.

매니페스트 파일을 만들려면 Visual Studio와 Azure Developer CLI 모두 특정 대상을 사용하여 .NET CLI run 명령을 실행합니다. 다음과 같이 동일한 명령을 수동으로 실행하여 고유의 매니페스트 파일을 만들 수 있습니다.

dotnet run --project eShop.AppHost\eShop.AppHost.csproj `
    --publisher manifest `
    --output-path ../aspire-manifest.json

참고 항목

--project 옵션으로 앱 호스트 프로젝트를 지정해야 합니다.

이 명령은 다음 텍스트와 유사한 출력을 생성합니다.

Building...
info: Aspire.Hosting.DistributedApplication[0]
      Aspire version: 8.0.1+a6e341ebbf956bbcec0dda304109815fcbae70c9
info: Aspire.Hosting.Publishing.ManifestPublisher[0]
      Published manifest to: C:\repos\eShop\aspire-manifest.json

dotnet 명령을 시작하려면 시작 프로필을 사용할 수도 있습니다. 시작 프로필은 .NET 프로젝트를 시작할 때 구성하는 설정 그룹입니다. 예를 들어, .NET Aspire 시작 템플릿은 다음과 같은 시작 프로필을 만듭니다.

"profiles": {
  "https": {
    "commandName": "Project",
    "dotnetRunMessages": true,
    "launchBrowser": true,
    "applicationUrl": "https://localhost:17170;http://localhost:15281",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development",
      "DOTNET_ENVIRONMENT": "Development",
      "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21147",
      "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22239"
    }
  },
  "http": {
    "commandName": "Project",
    "dotnetRunMessages": true,
    "launchBrowser": true,
    "applicationUrl": "http://localhost:15281",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development",
      "DOTNET_ENVIRONMENT": "Development",
      "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19197",
      "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20233"
    }
  }
}

이 텍스트와 유사한 JSON 코드가 있는 매니페스트 파일을 만들기 위해 시작 프로필을 추가합니다.

"profiles": {
  "generate-manifest": {
    "commandName": "Project",
    "launchBrowser": false,
    "dotnetRunMessages": true,
    "commandLineArgs": "--publisher manifest --output-path aspire-manifest.json"
  }
}

Visual Studio에서 디버깅을 시작할 때 generate-manifest 프로필을 선택할 수 있습니다. 명령줄에서 --launch-profile 옵션을 사용합니다.

dotnet run --launch-profile generate-manifest

매니페스트 파일의 형식

매니페스트는 resources라는 단일 최상위 요소가 포함된 JSON 파일입니다. 해당 개체 내에서 각 마이크로 서비스와 지원 서비스마다 하나의 개체를 찾을 수 있습니다. 이러한 각 개체에 대한 설정에는 연결 문자열, 환경 변수 및 컨테이너 이미지 이름이 포함됩니다.

다음은 수정하지 않은 .NET Aspire 시작 템플릿의 매니페스트 예입니다. 해당 솔루션은 Redis Cache를 사용합니다.

{
  "resources": {
    "cache": {
      "type": "container.v0",
      "connectionString": "{cache.bindings.tcp.host}:{cache.bindings.tcp.port}",
      "image": "docker.io/library/redis:7.2",
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "targetPort": 6379
        }
      }
    },
    "apiservice": {
      "type": "project.v0",
      "path": "AspireStarter.ApiService/AspireStarter.ApiService.csproj",
      "env": {
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory",
        "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http"
        },
        "https": {
          "scheme": "https",
          "protocol": "tcp",
          "transport": "http"
        }
      }
    },
    "webfrontend": {
      "type": "project.v0",
      "path": "AspireStarter.Web/AspireStarter.Web.csproj",
      "env": {
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory",
        "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true",
        "ConnectionStrings__cache": "{cache.connectionString}",
        "services__apiservice__http__0": "{apiservice.bindings.http.url}",
        "services__apiservice__https__0": "{apiservice.bindings.https.url}"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http",
          "external": true
        },
        "https": {
          "scheme": "https",
          "protocol": "tcp",
          "transport": "http",
          "external": true
        }
      }
    }
  }
}

연결 문자열 및 바인딩 참조

매니페스트 예에는 세 가지 리소스가 있습니다.

  • webfrontend: 이 리소스는 고객에게 웹 인터페이스를 제공하는 마이크로 서비스입니다.
  • apiservice: 이 리소스는 webfrontend가 호출하는 REST API입니다. 템플릿에서 이 호출은 날씨 데이터를 가져오는 것입니다.
  • cache: 이 리소스는 webfrontend 마이크로 서비스의 성능을 최적화하는 데 사용되는 Redis Cache입니다.

세 가지 리소스 각각에는 해당 리소스에 연결하는 데 사용할 수 있는 프로토콜을 지정하는 bindings 섹션이 포함되어 있습니다.

앱 호스트의 Program.cs 파일에서 webfrontend 프로젝트는 cacheapiservice에 모두 종속됩니다.

var cache = builder.AddRedis("cache");

var apiService = builder.AddProject<Projects.AspireStarter_ApiService>("apiservice");

builder.AddProject<Projects.AspireStarter_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithReference(cache)
    .WithReference(apiService);

매니페스트 파일에서 이러한 종속성은 환경 변수로 표현됩니다.

"env": {
  "ConnectionStrings__cache": "{cache.connectionString}",
  "services__apiservice__http__0": "{apiservice.bindings.http.url}",
  "services__apiservice__https__0": "{apiservice.bindings.https.url}"
}

.NET Aspire 프로젝트의 종속성이 매니페스트 파일에 참조를 생성하는 방식을 보여 주는 다이어그램.

종속성은 매니페스트 파일의 구조를 참조하는 자리 표시자 문자열을 사용합니다. 예를 들어, 세 번째 종속성은 API 서비스 HTTPS 바인딩을 참조하세요.

.NET Aspire 매니페스트 파일에서 자리 표시자가 구성되는 방식을 보여 주는 다이어그램.

자세한 정보