配置 Azure Container Apps 环境

可以很轻松地通过任何受支持的 API 将 资源发布为 Azure Container Apps (ACA)。

发布应用时,这些 API 会自动创建默认的 ACA 环境。 虽然此默认设置适用于大多数方案,但可能需要自定义 ACA 环境以满足特定要求。 若要实现此目的,请使用 AddAzureContainerAppEnvironment 该方法。

应用.NET.NET Aspire主机通过生成代码为应用程序创建Azure资源来简化基础结构预配。 使用此方法可以直接在 C# 中对与部署相关的方面进行建模和配置,从而减少依赖 Bicep 等工具的需求。 这些方面包括配置 ACA 环境,该环境为运行容器化应用程序提供无服务器平台。

通过使用 Azure.Provisioning API(在 基础结构即代码中介绍),可以配置和自定义 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();

默认情况下,调用此 API 添加 ACA 环境将生成以下预配 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 环境的用户分配托管标识。
  • Azure ACA 环境的容器注册表(ACR)。
  • ACA 环境的 Log Analytics 工作区。
  • 环境 Azure Container Apps 。
  • .NET .NET Aspire ACA 环境的仪表板
  • 用户主体 ID 到 ACA 环境的角色分配。
  • ACA 环境的各种输出。

acaEnv 使用变量,您可以链接调用 ConfigureInfrastructure API,以将 ACA 环境自定义成您想要的样子。 有关详细信息,请参阅 配置基础结构

处理命名约定

默认情况下,AddAzureContainerAppEnvironment 使用的资源命名方案与 Azure Developer CLI (azd) 不同Azure。 如果要升级以前使用 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 提供一个流畅的 API 来配置 ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) 资源,从而支持生成 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");
});

前面的代码:

另请参阅