다음을 통해 공유


.NET .NET Aspire 9.0의 새로운 기능

📢 .NET Aspire 9.0은 .NET Aspire의 다음 주요 일반 공급(GA) 릴리스입니다. 를 모두 지원합니다.

  • .NET 8.0 LTS(장기 지원) 또는
  • .NET 9.0 STS(표준 용어 지원).

메모

.NET 8 또는 .NET 9에서 .NET Aspire 9.0을 사용할 수 있습니다.

이 릴리스는 커뮤니티에서 가장 많이 요청된 기능 및 문제의 일부를 해결합니다. 가장 좋은 기능은 커뮤니티 기반입니다! 커뮤니티에 참여하려면 에서 Discord에 방문해 팀 구성원과 채팅하고, 우리와 함께 GitHub에서 협력해 보세요.

공식 .NET 버전 및 .NET Aspire 버전 지원에 대한 자세한 내용은 다음을 참조하세요.

.NET .NET Aspire 9로 업그레이드

이전 버전의 .NET Aspire를 .NET Aspire 9로 업그레이드하려면 .NET.NET Aspire 9 가이드의 공식 지침을 따르십시오. 이 가이드에서는 기존 .NET Aspire 솔루션을 .NET Aspire 9로 업그레이드하는 방법에 대한 자세한 지침을 제공합니다. 수동으로 진행하거나 업그레이드 도우미를 사용하더라도, 이 가이드는 프로세스를 단시간에 완료합니다.

도구 개선 사항

.NET Aspire 9를 사용하면 .NET Aspire 애플리케이션을 개발하도록 환경을 더 간단하게 구성할 수 있습니다. 더 이상 .NET 워크로드가 필요하지 않습니다. 대신 새 .NET.NET Aspire SDK를 귀하의 .NET.NET Aspire 솔루션의 앱 호스트 프로젝트에 설치합니다. 자세한 내용은 .NET.NET Aspire 설정 및 도구참조하세요.

템플릿이 이동되었습니다.

.NET .NET Aspire 9는 워크로드를 통해 설치되었던 콘텐츠를 별도의 NuGet 패키지로 이동합니다. 여기에는 새 .NET.NET Aspire 프로젝트 및 솔루션을 만들기 위한 템플릿이 포함됩니다. 이러한 템플릿은 dotnet new install 명령사용하여 설치됩니다. 다음 명령을 실행하여 설치할 수 있습니다.

dotnet new install Aspire.ProjectTemplates::9.0.0

.NET .NET Aspire 워크로드가 이미 설치된 경우 --force 플래그를 전달하여 기존 템플릿을 덮어써야 합니다. .NET .NET Aspire 워크로드를 자유롭게 제거할 수 있습니다.

자세한 내용은 템플릿 참조하세요.

대시보드 UX 향상된 기능 및 새로운 대화형 기능

릴리스될 때마다 .NET.NET Aspire 대시보드가 계속 개선됩니다.

리소스 수명 주기 관리

대시보드에서 가장 많이 요청되는 기능은 오케스트레이션된 명명된 리소스의 수명 주기를 관리하는 것입니다. 특히 리소스를 중지, 시작 및 다시 시작하는 기능입니다. 이 기능은 프로젝트, 컨테이너 및 실행 파일에서 작동합니다. 전체 앱 호스트를 다시 시작하지 않고도 개별 리소스를 다시 시작할 수 있습니다. 프로젝트 리소스의 경우 디버거가 연결되면 다시 시작할 때 다시 연결됩니다. 자세한 내용은 .NET.NET Aspire 대시보드: 리소스중지 또는 시작을 참조하세요.

모바일 및 반응형 지원

이제 .NET Aspire 대시보드는 모바일 친화적이며 다양한 화면 크기에 응답하고 배포된 .NET Aspire 애플리케이션의 이동 중 관리가 가능합니다. 모바일에서 설정 및 콘텐츠 오버플로 표시를 포함하여 기타 접근성이 향상되었습니다.

리소스 세부 정보의 민감한 속성, 볼륨 및 상태 점검

리소스 세부 정보 표시에는 다음과 같은 몇 가지 개선 사항이 포함되어 있습니다.

  • 속성은 중요한 것으로 표시되어 대시보드 UI에서 자동으로 마스킹할 수 있습니다. 이 보안 기능은 다른 사용자와 대시보드를 공유하는 화면에서 키 또는 암호를 실수로 공개하지 않도록 하는 데 도움이 됩니다. 예를 들어 컨테이너 인수는 중요한 정보를 전달할 수 있으므로 기본적으로 마스킹됩니다.

  • 구성된 컨테이너 볼륨은 리소스 세부 정보에 나열됩니다.

  • .NET .NET Aspire 9는 상태 검사에 대한 지원을 추가합니다. 이러한 검사에 대한 자세한 정보는 이제 리소스 세부 정보 창에서 볼 수 있으며, 리소스가 비정상으로 표시되거나 성능이 저하된 이유를 확인할 수 있습니다. 건강 상태 검사에 대해 여기에서자세히 알아보세요.

다채로운 콘솔 로그

ANSI 이스케이프 코드는 굵게, 밑줄, 기울기 등의 스타일과 색(전경 및 배경)을 제어하여 터미널의 텍스트 서식을. 이전에는 대시보드의 콘솔 로그 페이지가 한 번에 하나의 ANSI 이스케이프 코드만 렌더링할 수 있었으며, 여러 코드가 결합될 경우 렌더링에 실패했습니다. 예를 들어 빨간색 텍스트는 표시할 수 있지만 빨간색과 굵은 텍스트는 표시할 수 없습니다.

@mangeg의 커뮤니티 기여는 ANSI 이스케이프 코드에 대한 지원을 개선하고 이 제한을 제거했습니다.

화려한 콘솔 로그

콘솔 로그의 또 다른 개선 사항은 지원되지 않는 이스케이프 코드를 숨기는 것입니다. 커서 위치를 지정하거나 운영 체제와 통신하는 것과 같이 텍스트 표시와 관련이 없는 코드는 이 UI에서 의미가 없으며 숨겨집니다.

원격 분석 사용자 중심 기능 추가

원격 분석 여전히 .NET.NET Aspire의 중요한 측면입니다. .NET .NET Aspire 9에서는 원격 분석 서비스에 많은 새로운 기능이 도입되었습니다.

향상된 원격 분석 필터링

속성 값을 사용하여 추적을 필터링할 수 있습니다. 예를 들어 앱에서 하나의 엔드포인트에 대한 추적만 보려면 HTTP 요청의 http.route 특성을 지정된 값으로 필터링할 수 있습니다.

원격 분석 필터링은 기존 값의 자동 완성을 지원합니다. 필터 추가 대화 상자는 대시보드에서 사용할 수 있는 값 중에서 선택할 수 있는 콤보 상자를 제공합니다. 이 기능을 사용하면 실제 데이터를 훨씬 쉽게 필터링할 수 있으며 직접 값을 입력하여 오타를 방지할 수 있습니다.

자세한 내용은 .NET.NET Aspire 대시보드: 필터 추적을 참조하세요.

여러 리소스의 원격 분석을 결합합니다.

리소스에 복제본이 여러 개 있는 경우 원격 분석을 필터링하여 모든 인스턴스의 데이터를 한 번에 볼 수 있습니다. (application)레이블이 지정된 부모 리소스를 선택합니다. 자세한 내용은 .NET.NET Aspire 대시보드:여러 리소스의 원격 분석 결합을 참조하세요.

브라우저 원격 분석 지원

대시보드는 HTTP 및 CORS(원본 간 리소스 공유)를 통한 OpenTelemetry 프로토콜(OTLP)을 지원합니다. 이러한 기능을 통해 브라우저 앱에서 .NET Aspire 대시보드로 OpenTelemetry 보낼 수 있습니다.

예를 들어 브라우저 기반 SPA(단일 페이지 앱)는 브라우저에서 만든 구조적 로그, 추적 및 메트릭을 대시보드로 보내도록 JavaScript OpenTelemetry SDK 구성할 수 있습니다. 브라우저 원격 분석은 server 원격 분석과 함께 표시됩니다.

브라우저 텔레메트리가 있는 추적 세부 정보 페이지

브라우저 원격 분석 구성에 대한 자세한 내용은 브라우저 원격 분석 활성화 설명서를 참조하세요.

애플리케이션 호스트(오케스트레이션)

.NET .NET Aspire 앱 호스트는 .NET.NET Aspire의 가장 중요한 기능 중 하나입니다. .NET .NET Aspire 9에서는 앱 호스트에 특정한 몇 가지 새로운 기능이 추가되었습니다.

종속성 대기 중

.NET .NET Aspire를 따라오셨다면, 이미 그 앱 호스트 프로젝트에서 앱 모델을 정의한다는 것을 알고 계실 겁니다. 분산 애플리케이션 작성기를 만들고, 리소스를 추가 및 구성하고, 해당 종속성을 표현합니다. 이제 시작하기 전에 리소스가 다른 리소스에 대해 대기할 지정할 수 있습니다. 이렇게 하면 해당 종속성이 "준비"된 경우에만 리소스를 시작하여 시작하는 동안 연결 오류를 방지할 수 있습니다.

var builder = DistributedApplication.CreateBuilder(args);

var rabbit = builder.AddRabbitMQ("rabbit");

builder.AddProject<Projects.WebApplication1>("api")
       .WithReference(rabbit)
       .WaitFor(rabbit); // Don't start "api" until "rabbit" is ready...

builder.Build().Run();

앱 호스트가 시작되면 rabbit 리소스가 준비될 때까지 기다린 후에 api 리소스를 시작합니다.

리소스를 대기하기 위해 사용할 수 있는 두 가지 방법이 있습니다.

  • WaitFor: 다른 리소스를 시작하기 전에 리소스가 준비될 때까지 기다립니다.
  • WaitForCompletion: 다른 리소스를 시작하기 전에 리소스가 완료되기를 기다립니다.

자세한 내용은 .NET.NET Aspire 앱 호스트: 리소스를 기다리는 중인 상태을 참조하세요.

리소스 상태 검사

WaitFor API는 표준 .NET 상태 검사 사용하여 리소스가 준비되었는지 확인합니다. 하지만 "준비 중인 리소스"는 무엇을 의미할까요? 가장 좋은 점은 소비자가 기본값을 초과하여 구성할 수 있다는 것입니다.

리소스가 상태 검사를 노출하지 않으면(앱에 등록된 상태 검사 없음) 앱 호스트는 리소스가 Running 상태에 있을 때까지 기다린 후 종속 리소스를 시작합니다.

HTTP 엔드포인트를 노출하는 리소스의 경우 HTTP 200 응답에 대한 특정 경로를 폴링하는 상태 검사를 쉽게 추가할 수 있습니다.

var builder = DistributedApplication.CreateBuilder(args);

var catalogApi = builder.AddContainer("catalog-api", "catalog-api")
                        .WithHttpEndpoint(targetPort: 8080)
                        .WithHttpHealthCheck("/health");

builder.AddProject<Projects.WebApplication1>("store")
       .WithReference(catalogApi.GetEndpoint("http"))
       .WaitFor(catalogApi);

builder.Build().Run();

앞의 예제에서는 catalog-api 리소스에 상태 검사를 추가합니다. 앱 호스트는 store 리소스를 시작하기 전에 상태 검사가 정상 상태를 반환할 때까지 기다립니다. /health 엔드포인트가 HTTP 200 상태 코드를 반환할 때 리소스가 준비되었는지 확인합니다.

store catalog-api 정상 상태가 되기를 기다리는 동안 대시보드의 리소스는 다음과 같이 표시됩니다.

건강하지 않은 리소스를 기다린 후에 시작

앱 호스트의 상태 검사 메커니즘은 Microsoft.Extensions.Diagnostics.HealthChecks 네임스페이스의 IHealthChecksBuilder 구현을 기반으로 합니다.

대시보드에 표시되는 상태 검사 보고서 데이터.

대시보드의 리소스 세부 정보 보기에서 상태 확인 세부 정보

사용자 지정 상태 검사를 만드는 것은 간단합니다. 먼저 상태 검사를 정의한 다음 해당 이름을 적용되는 리소스와 연결합니다.

var builder = DistributedApplication.CreateBuilder(args);

var healthyAfter = DateTime.Now.AddSeconds(20);

builder.Services.AddHealthChecks().AddCheck(
    "delay20secs",
    () => DateTime.Now > healthyAfter 
        ? HealthCheckResult.Healthy() 
        : HealthCheckResult.Unhealthy()
    );

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

builder.AddProject<Projects.MyApp>("myapp")
       .WithReference(cache)
       .WaitFor(cache);

앞의 예제에서는 앱 호스트가 시작된 후 처음 20초 동안 비정상으로 보고하는 cache 리소스에 상태 검사를 추가합니다. 따라서 myapp 리소스는 시작하기 전에 20초 동안 대기하여 cache 리소스가 정상인지 확인합니다.

AddCheckWithHealthCheck 메서드는 상태 검사를 만들고 특정 리소스와 연결하는 간단한 메커니즘을 제공합니다.

영구 컨테이너

이제 앱 호스트는 영구 컨테이너를 지원합니다. 영구 컨테이너는 오케스트레이션된 앱의 일반적인 컨테이너 수명 주기에서 벗어난다. 만들어지고 .NET Aspire 오케스트레이터가(아직 사용할 수 없는 경우)을 시작하지만 .NET Aspire의해 제거되지는 않습니다.

앱 호스트가 중지된 후에도 컨테이너를 계속 실행하려는 경우에 유용합니다.

중요하다

이러한 컨테이너를 삭제하려면 컨테이너 런타임을 사용하여 수동으로 중지해야 합니다.

영구적인 수명을 가지는 IResourceBuilder<ContainerResource>을 정의하려면 WithLifetime 메서드를 호출하고 ContainerLifetime.Persistent를 전달하십시오.

var builder = DistributedApplication.CreateBuilder(args);

var queue = builder.AddRabbitMQ("rabbit")
                   .WithLifetime(ContainerLifetime.Persistent);

builder.AddProject<Projects.WebApplication1>("api")
       .WithReference(queue)
       .WaitFor(queue);

builder.Build().Run();

대시보드에는 핀 아이콘으로 표시된 영구 컨테이너가 나타납니다.

영구 컨테이너

앱 호스트가 중지된 후 컨테이너는 계속 실행됩니다.

데스크톱에서 RabbitMQ를 표시하는 Docker

컨테이너 지속성 메커니즘은 컨테이너를 다시 만들 수 있는 시기를 식별하려고 시도합니다. 예를 들어 컨테이너 환경이 변경되면 리소스에 대한 입력 구성이 변경된 경우 컨테이너를 수동으로 중지할 필요가 없도록 컨테이너가 다시 시작됩니다.

리소스 명령

앱 호스트는 리소스에 사용자 지정 명령 추가를 지원합니다. 이 기능은 앱 호스트에서 기본적으로 지원되지 않는 사용자 지정 기능을 추가하려는 경우에 유용합니다. 리소스에 사용자 지정 확장 메서드를 노출하는 것이 유용한 기회가 많을 수 있습니다. .NET .NET Aspire 커뮤니티 도구 키트 이러한 확장을 공유하기에 좋은 장소일 수 있습니다.

사용자 지정 명령을 정의하면 대시보드에서 사용자 환경 기능으로 사용할 수 있습니다.

중요하다

이러한 .NET.NET Aspire 대시보드 명령은 대시보드를 로컬로 실행하는 경우에만 사용할 수 있습니다. Azure Container Apps대시보드를 실행할 때는 사용할 수 없습니다.

사용자 지정 리소스 명령을 만드는 방법에 대한 자세한 내용은 방법: .NET.NET Aspire사용자 지정 리소스 명령 만들기를 참조하세요.

컨테이너 네트워킹

이제 앱 호스트는 모든 컨테이너를 default-aspire-network이라는 공통 네트워크에 추가합니다. 호스트 네트워크를 거치지 않고 컨테이너 간에 통신하려는 경우에 유용합니다. 또한 컨테이너가 컨테이너 이름을 사용하여 서로 통신할 수 있으므로 docker 작성에서 앱 호스트로 쉽게 마이그레이션할 수 있습니다.

이벤트 모델

이벤트 모델을 사용하면 개발자가 애플리케이션 및 리소스의 수명 주기에 연결할 수 있습니다. 이는 애플리케이션 수명 주기의 특정 지점에서 사용자 지정 코드를 실행하는 데 유용합니다. 전역 이벤트 및 리소스별 이벤트를 포함하여 이벤트를 구독하는 다양한 방법이 있습니다.

글로벌 이벤트:

  • BeforeStartEvent: 애플리케이션이 시작되기 전에 트리거되는 이벤트입니다. 앱 모델의 변경 내용이 마지막으로 관찰되는 위치입니다. "실행" 모드와 "게시" 모드 모두에서 실행됩니다. 이는 모든 처리기가 완료될 때까지 애플리케이션이 시작되지 않음을 의미하는 차단 이벤트입니다.
  • AfterResourcesCreatedEvent: 리소스를 만든 후 트리거되는 이벤트입니다. 실행 모드에서만 실행됩니다.
  • AfterEndpointsAllocatedEvent: 엔드포인트가 모든 리소스에 할당된 후 트리거되는 이벤트입니다. 실행 모드에서만 실행됩니다.

글로벌 이벤트는 앱 호스트의 라이프사이클 이벤트와 유사합니다. 자세한 내용은 앱 호스트 수명 주기참조하세요.

리소스별 이벤트 :

  • BeforeResourceStartedEvent: 단일 리소스가 시작되기 전에 트리거되는 이벤트입니다. 실행 모드에서만 실행됩니다. 이는 모든 처리기가 완료될 때까지 리소스가 시작되지 않음을 의미하는 차단 이벤트입니다.
  • ConnectionStringAvailableEvent: 리소스에 연결 문자열을 사용할 수 있을 때 트리거되는 이벤트입니다. 실행 모드에서만 실행됩니다.
  • ResourceReadyEvent: 리소스를 사용할 준비가 되면 트리거되는 이벤트입니다. 실행 모드에서만 실행됩니다.

자세한 내용은 이벤트를 참조하세요.

통합

.NET .NET Aspire 즐겨 찾는 서비스 및 도구를 쉽게 시작할 수 있도록 통합을 계속 추가합니다. 자세한 내용은 .NET.NET Aspire 통합 개요참조하세요.

Redis 인사이트

Redis 리소스에서 Redis Insights 지원을 이용할 수 있습니다.

var builder = DistributedApplication.CreateBuilder(args);

builder.AddRedis("redis")
       .WithRedisInsight(); // Starts a Redis Insight container image
                            // that is pre-configured to work with the
                            // Redis instance.

WithRedisInsight 확장 메서드는 여러 Redis 리소스에 적용할 수 있으며 각각 Redis Insight 대시보드에 표시됩니다.

Redis Insight 대시보드가 여러 Redis 인스턴스를 보여 줌

자세한 내용은 Redis Insights사용하여 Redis 리소스 추가를 참조하세요.

OpenAI(미리 보기)

.NET Aspire 9부터 최신 공식 OpenAI dotnet 라이브러리를 직접 사용할 수 있는 추가 OpenAI 통합을 사용할 수 있습니다. client 통합은 서비스 컬렉션에 OpenAIClient를 싱글톤 서비스로 등록합니다. client 사용하여 OpenAIREST API와 상호 작용할 수 있습니다.

또한, 이미 사용 가능한 .NET AspireAzureOpenAI 통합가 개선되어, 새롭게 추가된 AddOpenAIClientFromConfiguration(IHostApplicationBuilder, String) 빌더 메서드를 이용해 Azure AI OpenAI 서비스 또는 전용 OpenAIREST API 중 하나에 대해 OpenAIClient를 구성할 수 있는 유연한 방법을 제공합니다. 다음 예제에서는 연결 문자열이 AzureAzure AI OpenAI 서비스에 대한 것인지 검색하고 가장 적절한 OpenAIClient 인스턴스를 자동으로 등록합니다.

builder.AddOpenAIClientFromConfiguration("openai");

예를 들어 openai 연결이 Endpoint=https://{account}.azure.com;Key={key};처럼 보이면 도메인 이름 때문에 Azure AI OpenAIclient을 등록할 수 있을 것으로 추정됩니다. 그렇지 않으면 흔히 사용되는 OpenAIClient가 사용됩니다.

Azure형상에 구애받지 않는 client 해상도에 대해 더 자세히 알아보세요.

MongoDB

AddMongoDB(IDistributedApplicationBuilder, String, Nullable<Int32>, IResourceBuilder<ParameterResource>, IResourceBuilder<ParameterResource>) 확장 메서드를 사용할 때 MongoDB 사용자 이름 및 암호를 지정하는 지원이 추가되었습니다. 지정하지 않으면 임의의 사용자 이름과 암호가 생성되지만 매개 변수 리소스를 사용하여 수동으로 지정할 수 있습니다.

var builder = DistributedApplication.CreateBuilder(args);

var username = builder.AddParameter("mongousername");
var password = builder.AddParameter("mongopassword", secret: true);

var db = builder.AddMongo("db", username, password);

중요한 Azure 개선 사항

다음 섹션에서는 .NET Aspire 9에 추가된 Azure 개선 사항에 대해 설명합니다. 모든 주요 변경 사항의 전체 목록은 9의 호환성이 손상되는 변경 내용 을 참조하세요.

Azure 리소스 사용자 지정

.NET Aspire 8에서는 기본 Azure.Provisioning 라이브러리가 새롭고, 안정적으로 표시되기 전에 피드백을 수집하기 위해 Azure 리소스를 사용자 지정하는 것이 실험적인 것으로 표시되었습니다. .NET .NET Aspire 9에서 이러한 API가 업데이트되고 실험적 특성이 제거되었습니다.

Azure 리소스 명명 호환성이 손상되는 변경

Azure.Provisioning 라이브러리 업데이트의 일환으로 Azure 리소스에 대한 기본 명명 체계가 다양한 명명 정책에 대한 더 나은 지원으로 업데이트되었습니다. 그러나 이 업데이트로 인해 리소스의 이름이 변경되었습니다. 새 명명 정책으로 인해 .NET Aspire 애플리케이션을 8에서 9로 업데이트한 후 기존 Azure 리소스가 중단되고 새 Azure 리소스가 생성될 수 있습니다. .NET .NET Aspire 8에서 동일한 명명 정책을 계속 사용하려면 AppHost Program.cs다음 코드를 추가할 수 있습니다.

var builder = DistributedApplication.CreateBuilder(args);

builder.Services.Configure<AzureProvisioningOptions>(options =>
{
    options.ProvisioningBuildOptions.InfrastructureResolvers.Insert(0, new AspireV8ResourceNamePropertyResolver());
});

Azure SQL, PostgreSQL및 Redis 업데이트

Azure SQL, PostgreSQL및 Redis 리소스는 이러한 기술에 대한 로컬 컨테이너 리소스가 있으므로 다른 Azure 리소스와 다릅니다. .NET Aspire 8에서 이러한 Azure 리소스를 만들기 위해 먼저 로컬 컨테이너 리소스로 시작한 다음, 이를 Azure 리소스로 "As" 또는 "PublishAs" 해야 했습니다. 이 디자인은 문제를 발생시켰고 다른 API와 맞지 않았습니다.

예를 들어 .NET.NET Aspire 8에 다음 코드가 있을 수 있습니다.

var builder = DistributedApplication.CreateBuilder(args);

var sql = builder.AddSqlServer("sql")
                 .PublishAsAzureSqlDatabase();

var pgsql = builder.AddPostgres("pgsql")
                   .PublishAsAzurePostgresFlexibleServer();

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

.NET .NET Aspire 9에서 이러한 API는 사용되지 않는 것으로 표시되고 새 API 패턴이 구현되었습니다.

var builder = DistributedApplication.CreateBuilder(args);

var sql = builder.AddAzureSqlServer("sql")
                 .RunAsContainer();

var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
                   .RunAsContainer();

var cache = builder.AddAzureRedis("cache")
                   .RunAsContainer();
기본적으로 Microsoft Entra ID

.NET Aspire 애플리케이션의 보안을 위해 AzurePostgreSQL 및 Azure Cache for Redis 리소스용 데이터베이스는 기본적으로 Microsoft Entra ID를 사용하도록 업데이트되었습니다. 이렇게 하려면 이러한 리소스에 연결해야 하는 애플리케이션을 변경해야 합니다. Microsoft Entra ID를 사용하여 이러한 리소스에 연결하도록 애플리케이션을 업데이트하려면 다음을 참조하세요.

다음 예제에서는 Microsoft Entra ID를 사용하여 Azure 리소스에 연결하도록 애플리케이션을 구성하는 방법을 보여 줍니다.

암호 또는 액세스 키 인증을 사용해야 하는 경우(권장하지 않음) 다음 코드를 사용하여 옵트인할 수 있습니다.

var builder = DistributedApplication.CreateBuilder(args);

var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
                   .WithPasswordAuthentication();

var cache = builder.AddAzureRedis("cache")
                   .WithAccessKeyAuthentication();

Azure 함수 지원(미리 보기)

Azure Functions 대한 지원은 .NET.NET Aspire 문제 추적기에서 가장 널리 요청된 기능 중 하나이며, 이 릴리스에서 미리 보기 지원을 도입하게 되어 기쁩니다. 이 지원을 보여주기 위해 .NET.NET Aspire 사용하여 웹후크를 만들고 배포해 보겠습니다.

시작하려면 Visual Studio 새 프로젝트 대화 상자를 사용하여 새 Azure Functions 프로젝트를 만듭니다. 프로젝트를 만들 때 메시지가 표시되면 등록 Aspire 오케스트레이션 확인란을 선택합니다.

새 .NET AspireAzure Functions 프로젝트를 만듭니다.

앱 호스트 프로젝트에서 새 📦Aspire.Hosting.에 PackageReference가 있는지 확인합니다.Azure.기능 NuGet 패키지:

<ItemGroup>
    <PackageReference Include="Aspire.Hosting.AppHost" Version="9.0.0" />
    <PackageReference Include="Aspire.Hosting.Azure.Functions" Version="9.0.0" />
</ItemGroup>

이 패키지는 .NET Aspire 호스트 내에서 Azure Functions 프로젝트를 구성하기 위해 앱 호스트에서 호출할 수 있는 AddAzureFunctionsProject<TProject>(IDistributedApplicationBuilder, String) API를 제공합니다.

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp");

builder.Build().Run();

이 예제에서 웹후크는 입력 문자열을 Pig Latin으로 변환합니다. 트리거의 내용을 다음 코드로 업데이트합니다.

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
using System.Text;
using FromBodyAttribute = Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute;

namespace PigLatinApp;

public class Function1(ILogger<Function1> logger)
{
    public record InputText(string Value);
    public record PigLatinText(string Value);

    [Function("Function1")]
    public IActionResult Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req,
        [FromBody] InputText inputText)
    {
        logger.LogInformation("C# HTTP trigger function processed a request.");

        var result = TranslateToPigLatin(inputText.Value);

        return new OkObjectResult(new PigLatinText(result));
    }

    private static string TranslateToPigLatin(string input)
    {
        if (string.IsNullOrEmpty(input))
        {
            return input;
        }

        var words = input.Split(' ');
        StringBuilder pigLatin = new();

        foreach (string word in words)
        {
            if (IsVowel(word[0]))
            {
                pigLatin.Append(word + "yay ");
            }
            else
            {
                int vowelIndex = FindFirstVowelIndex(word);
                if (vowelIndex is -1)
                {
                    pigLatin.Append(word + "ay ");
                }
                else
                {
                    pigLatin.Append(
                        word.Substring(vowelIndex) + word.Substring(0, vowelIndex) + "ay ");
                }
            }
        }

        return pigLatin.ToString().Trim();
    }

    private static int FindFirstVowelIndex(string word)
    {
        for (var i = 0; i < word.Length; i++)
        {
            if (IsVowel(word[i]))
            {
                return i;
            }
        }
        return -1;
    }

    private static bool IsVowel(char c) =>
        char.ToLower(c) is 'a' or 'e' or 'i' or 'o' or 'u';
}

Run 메서드의 첫 번째 logger.LogInformation 줄에 중단점을 설정하고 F5 눌러 Functions 호스트를 시작합니다. .NET .NET Aspire 대시보드가 시작되면 다음을 관찰합니다.

.NET Aspire가 Azure 함수 앱과 함께 실행되는 스크린샷입니다.

.NET .NET Aspire 다음과 같습니다.

  • 호스트에서 회계 관리에 사용할 에뮬레이션된 Azure 스토리지 리소스를 구성했습니다.
  • Functions 프로젝트가 등록됨에 따라 대상과 함께 Functions 호스트를 로컬로 시작했습니다.
  • launchSettings에 정의된 포트를 연결하여 함수 프로젝트의json가 수신 대기를 할 수 있도록 했습니다.

선택한 원하는 HTTP client을 사용하여 트리거에 요청을 보내고, 디버거의 요청 본문에서 바인딩된 입력을 관찰합니다.

curl --request POST \
  --url http://localhost:7282/api/Function1 \
  --header 'Content-Type: application/json' \
  --data '{
  "value": "Welcome to Azure Functions"
}'

.NET Aspire 대시보드의 스크린샷: Azure 함수 앱 디버깅.

이제 ACA(Azure Container Apps)에 애플리케이션을 배포할 준비가 되었습니다. 배포는 현재 Azure Functions Worker 및 Worker SDK 패키지의 미리 보기 빌드에 따라 달라집니다. 필요한 경우 Functions 프로젝트에서 참조되는 버전을 업그레이드합니다.

<ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.0.0-preview2" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="2.0.0-preview2" />
</ItemGroup>

또한 http 트리거에 요청을 보낼 수 있도록 Azure Functions 프로젝트에 대한 퍼블릭 엔드포인트를 노출해야 합니다.

builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp")
       .WithExternalHttpEndpoints();

CLI사용하여 애플리케이션을 배포하려면 먼저 최신 버전을 가져와야 합니다. 최신 버전을 설치하려면 버전이 만료된 경우 경고가 표시됩니다. 지침에 따라 최신 버전으로 업데이트합니다.

설치한 후 앱 호스트 프로젝트가 포함된 폴더로 이동하고 azd init실행합니다.

$ azd init

Initializing an app to run on Azure (azd init)

? How do you want to initialize your app? Use code in the current directory

  (✓) Done: Scanning app code in current directory

Detected services:

  .NET (Aspire)
  Detected in: ./PigLatinApp/PigLatinApp.AppHost/PigLatinApp.AppHost.csproj

azd will generate the files necessary to host your app on Azure using Azure Container Apps.

? Select an option Confirm and continue initializing my app
? Enter a new environment name: azfunc-piglatin

Generating files to run your app on Azure:

  (✓) Done: Generating ./azure.yaml
  (✓) Done: Generating ./next-steps.md

SUCCESS: Your app is ready for the cloud!

그런 다음, azd up실행하여 애플리케이션을 배포합니다.

$ azd up 
? Select an Azure Subscription to use: 130. [redacted]
? Select an Azure location to use: 50. (US) West US 2 (westus2)

Packaging services (azd package)


Provisioning Azure resources (azd provision)
Provisioning Azure resources can take some time.

Subscription: [redacted]
Location: West US 2

  You can view detailed progress in the Azure Portal:
  [redacted]

  (✓) Done: Resource group: rg-azfunc-piglatin (967ms)
  (✓) Done: Container Registry: [redacted] (13.316s)
  (✓) Done: Log Analytics workspace: [redacted] (16.467s)
  (✓) Done: Container Apps Environment: [redacted] (1m35.531s)
  (✓) Done: Storage account: [redacted] (21.37s)

Deploying services (azd deploy)

  (✓) Done: Deploying service piglatinapp
  - Endpoint: {{endpoint-url}}

  Aspire Dashboard: {{dashboard-url}}

마지막으로 선호하는 HTTP client을 사용하여 배포된 Functions 애플리케이션을 테스트합니다.

curl --request POST \
  --url {{endpoint-url}}/api/Function1 \
  --header 'Content-Type: application/json' \
  --data '{
  "value": "Welcome to Azure Functions"
}'

Azure Functions에 대한 .NET Aspire의 지원은 여러 제한된 트리거에 대한 지원과 함께 여전히 미리 보기 상태입니다.

자세한 내용은 공식 .NET AspireAzure Functions 통합(미리 보기)참조하세요.

Azure Container Apps 사용자 지정

가장 많이 요청된 기능 중 하나는 앱 호스트가 Bicep을 건드리지 않고 생성하는 Azure Container Apps을 사용자 지정할 수 있는 기능입니다. Aspire.Hosting.Azure.AppContainers 네임스페이스에서 PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>)PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>) API를 사용하면 가능합니다. 이러한 메서드는 앱 호스트가 만드는 Azure 컨테이너 앱 정의를 사용자 지정합니다.

프로젝트 파일에 패키지 참조를 추가합니다.

<ItemGroup>
  <PackageReference Include="Aspire.Hosting.Azure.AppContainers"
                    Version="9.0.0" />
</ItemGroup>

다음 예제에서는 Azure 컨테이너 앱을 0(0) 복제본으로 확장하는 방법을 보여 줍니다.

var builder = DistributedApplication.CreateBuilder(args);

var db = builder.AddAzurePostgresFlexibleServer("pg")
                .RunAsContainer()
                .AddDatabase("db");

// Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
#pragma warning disable AZPROVISION001

builder.AddProject<Projects.WebApplication1>("api")
       .WithReference(db)
       .PublishAsAzureContainerApp((module, containerApp) =>
       {
           // Scale to 0
           containerApp.Template.Value!.Scale.Value!.MinReplicas = 0;
       });

#pragma warning restore AZPROVISION001

builder.Build().Run();

앞의 코드 예제에서는 Azure Container App 정의의 생성을 앱 호스트에 지연합니다. 이렇게 하면 azd infra synth을 실행하지 않고 생성된 bicep 파일을 안전하게 수정하지 않고도 Azure Container App 정의를 사용자 지정할 수 있습니다.

참조