다음을 통해 공유


Azure Container Apps 환경을 구성하십시오

지원되는 API를 사용하여 리소스를 ACA로 쉽게 게시할 수 있습니다.

이러한 API는 앱을 게시할 때 자동으로 기본 ACA 환경을 만듭니다. 이 기본 설정은 대부분의 시나리오에서 잘 작동하지만 특정 요구 사항을 충족하도록 ACA 환경을 사용자 지정해야 할 수 있습니다. 이를 위해 메서드를 AddAzureContainerAppEnvironment 사용합니다.

앱 호스트는.NET.NET Aspire 애플리케이션에 대한 리소스를 만드는 Azure 코드를 생성하여 인프라 프로비저닝을 간소화합니다. 이 방법을 사용하면 C#에서 직접 배포 관련 측면을 모델링하고 구성할 수 있으므로 Bicep과 같은 도구에 의존할 필요가 줄어듭니다. 이러한 측면에는 컨테이너화된 애플리케이션을 실행하기 위한 서버리스 플랫폼을 제공하는 ACA 환경 구성이 포함됩니다.

API(리소스 사용자 지정Azure에 설명됨)를 사용하여 Azure.Provisioning 컨테이너 레지스트리 및 파일 공유 볼륨과 같은 관련 리소스와 함께 ACA 환경을 구성하고 사용자 지정할 수 있습니다. 사용 가능한 모든 배포 설정을 구성할 수 있습니다. 사용 가능한 설정에 대한 자세한 내용은 Microsoft.App managedEnvironments를 참조하세요.

이 문서에서는 솔루션에 맞게 .NET.NET Aspire ACA 환경을 조정하는 프로세스를 안내합니다.

ACA 환경 추가

형식은 AzureContainerAppEnvironmentResource ACA 환경 리소스를 모델화합니다. AddAzureContainerAppEnvironment 메서드를 호출하면 이 형식의 인스턴스가 생성되어 IResourceBuilder<T>에 포함됩니다.

var builder = DistributedApplication.CreateBuilder(args);

var acaEnv = builder.AddAzureContainerAppEnvironment("aca-env");

// Omitted for brevity...

builder.Build().Run();

기본적으로 ACA 환경을 추가하기 위해 이 API를 호출하면 다음 프로비전 Bicep 모듈이 생성됩니다.

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

param userPrincipalId string

param tags object = { }

resource aca_env_mi 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: take('aca_env_mi-${uniqueString(resourceGroup().id)}', 128)
  location: location
  tags: tags
}

resource aca_env_acr 'Microsoft.ContainerRegistry/registries@2023-07-01' = {
  name: take('acaenvacr${uniqueString(resourceGroup().id)}', 50)
  location: location
  sku: {
    name: 'Basic'
  }
  tags: tags
}

resource aca_env_acr_aca_env_mi_AcrPull 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(aca_env_acr.id, aca_env_mi.id, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d'))
  properties: {
    principalId: aca_env_mi.properties.principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d')
    principalType: 'ServicePrincipal'
  }
  scope: aca_env_acr
}

resource aca_env_law 'Microsoft.OperationalInsights/workspaces@2023-09-01' = {
  name: take('acaenvlaw-${uniqueString(resourceGroup().id)}', 63)
  location: location
  properties: {
    sku: {
      name: 'PerGB2018'
    }
  }
  tags: tags
}

resource aca_env 'Microsoft.App/managedEnvironments@2024-03-01' = {
  name: take('acaenv${uniqueString(resourceGroup().id)}', 24)
  location: location
  properties: {
    appLogsConfiguration: {
      destination: 'log-analytics'
      logAnalyticsConfiguration: {
        customerId: aca_env_law.properties.customerId
        sharedKey: aca_env_law.listKeys().primarySharedKey
      }
    }
    workloadProfiles: [
      {
        name: 'consumption'
        workloadProfileType: 'Consumption'
      }
    ]
  }
  tags: tags
}

resource aspireDashboard 'Microsoft.App/managedEnvironments/dotNetComponents@2024-10-02-preview' = {
  name: 'aspire-dashboard'
  properties: {
    componentType: 'AspireDashboard'
  }
  parent: aca_env
}

resource aca_env_Contributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(aca_env.id, userPrincipalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c'))
  properties: {
    principalId: userPrincipalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
  }
  scope: aca_env
}

output MANAGED_IDENTITY_NAME string = aca_env_mi.name

output MANAGED_IDENTITY_PRINCIPAL_ID string = aca_env_mi.properties.principalId

output AZURE_LOG_ANALYTICS_WORKSPACE_NAME string = aca_env_law.name

output AZURE_LOG_ANALYTICS_WORKSPACE_ID string = aca_env_law.id

output AZURE_CONTAINER_REGISTRY_NAME string = aca_env_acr.name

output AZURE_CONTAINER_REGISTRY_ENDPOINT string = aca_env_acr.properties.loginServer

output AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID string = aca_env_mi.id

output AZURE_CONTAINER_APPS_ENVIRONMENT_NAME string = aca_env.name

output AZURE_CONTAINER_APPS_ENVIRONMENT_ID string = aca_env.id

output AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN string = aca_env.properties.defaultDomain

이 모듈은 다음을 구성합니다.

  • ACA 환경에 대한 사용자 할당 관리 ID입니다.
  • Azure ACA 환경에 대한 ACR(Container Registry)입니다.
  • ACA 환경에 대한 Log Analytics 작업 영역입니다.
  • Azure Container Apps 환경입니다.
  • ACA 환경에 대한 대시보드입니다..NET.NET Aspire
  • ACA 환경에 대한 사용자 주체 ID의 역할 할당입니다.
  • ACA 환경에 대한 다양한 출력입니다.

변수를 acaEnv 사용하여 API에 대한 호출을 연결하여 ConfigureInfrastructure ACA 환경을 원하는 대로 사용자 지정할 수 있습니다. 자세한 내용은 인프라 구성을 참조하세요.

명명 규칙을 다루기

기본적으로 AddAzureContainerAppEnvironmentazd 사용합니다. 이전에 사용한 azd기존 배포를 업그레이드하는 경우 중복 Azure 리소스가 표시될 수 있습니다. 이 문제를 방지하려면 WithAzdResourceNaming 메서드를 호출하여 azd에서 사용된 명명 규칙으로 되돌아가야 합니다.

var builder = DistributionApplicationBuilder.Create(args);

var acaEnv = builder.AddAzureContainerAppEnvironment("aca-env")
                    .WithAzdResourceNaming();

// Omitted for brevity...

builder.Build().Run();

이 API를 호출하면 기존 Azure 리소스가 일관성을 유지하고 중복을 방지할 수 있습니다.

프로비저닝 인프라 사용자 지정

모든 .NET AspireAzure 리소스는 AzureProvisioningResource 형식의 하위 클래스입니다. 이렇게 하면 Azure API를 사용하여 ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) 리소스를 구성하는 흐름 API를 제공하여 생성된 Bicep을 사용자 지정할 수 있습니다.

var builder = DistributionApplicationBuilder.Create(args);

var acaEnv = builder.AddAzureContainerAppEnvironment(Config.ContainEnvironmentName);

acaEnv.ConfigureInfrastructure(config =>
{
    var resources = config.GetProvisionableResources();
    var containerEnvironment = resources.OfType<ContainerAppManagedEnvironment>().FirstOrDefault();

    containerEnvironment.Tags.Add("ExampleKey", "Example value");
});

앞의 코드는 다음과 같습니다.

참고하십시오