Usare il routing basato su regole con App Azure Container

Questo articolo illustra come usare il routing basato su regole con App Azure Container. Con il routing basato su regole, si crea un nome di dominio completo (FQDN) nell'ambiente delle app contenitore. Si usano quindi le regole per instradare le richieste per questo FQDN a app contenitore diverse, a seconda del percorso di ogni richiesta.

Modello di instradamento e autorizzazione

Le configurazioni di rotte HTTP (httpRouteConfigs) operano a livello di ambiente Container Apps. Un percorso può indirizzare qualsiasi app container nello stesso ambiente, indipendentemente dall'impostazione di ingresso individuale dell'app target. Poiché il FQDN della route è pubblicato sotto il dominio dell'ambiente, un percorso può fornire un punto di ingresso pubblico che inoltra le richieste a un'app container che utilizza ingress interno (external: false). Questo comportamento consente la composizione di più app sotto un unico host.

I permessi per le configurazioni di routing HTTP sono riportati all'ambiente gestito piuttosto che alle singole app container. Creare, aggiornare o cancellare una route richiede il Microsoft.App/managedEnvironments/httpRouteConfigs/write permesso sull'ambiente. Non è necessario alcun permesso aggiuntivo sull'app container target. Questo comportamento è coerente con il fatto che l'ambiente sia un confine di trust condiviso, dove tutte le app container in un ambiente appartengono allo stesso cliente. Qualsiasi principale con un ruolo con ambito ambientale che include httpRouteConfigs/write permessi, come Contributor sull'ambiente, può creare percorsi che mirano a qualsiasi app container in quell'ambiente.

Importante

Una configurazione di routing HTTP può esporre un'app container che utilizza ingress interni (external: false) se configuri l'app come route target. L'impostazione external: false controlla la visibilità del FQDN dell'app. Utilizzando questa configurazione, l'ambiente non impedisce all'app di ricevere traffico attraverso una rotta a livello di ambiente. Per mantenere un'app container irraggiungibile dall'esterno dell'ambiente, non farla riferimento come target in nessuna configurazione di routing HTTP. Invece, posiziona l'app in un ambiente separato senza percorsi pubblici, oppure usa controlli a livello di rete per limitare il traffico in entrata (enbound traffic).

Prerequisiti

Configurazione

  1. Eseguire il comando seguente per accedere ad Azure dall'interfaccia della riga di comando.

    az login
    
  2. Per assicurarsi di eseguire l'ultima versione dell'interfaccia della riga di comando, eseguire il comando di upgrade.

    az upgrade
    

    Ignorare eventuali avvisi sui moduli attualmente in uso.

  3. Ora che l'estensione o il modulo corrente è installato, registrate gli spazi dei nomi Microsoft.App e Microsoft.OperationalInsights.

    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

Creare variabili di ambiente

Creare le variabili di ambiente seguenti.

CONTAINER_APP_1_NAME="my-container-app-1"
CONTAINER_APP_1_IMAGE="mcr.microsoft.com/k8se/quickstart:latest"
CONTAINER_APP_1_TARGET_PORT="80"
CONTAINER_APP_2_NAME="my-container-app-2"
CONTAINER_APP_2_IMAGE="mcr.microsoft.com/dotnet/samples:aspnetapp"
CONTAINER_APP_2_TARGET_PORT="8080"
LOCATION="eastus"
RESOURCE_GROUP="my-container-apps"
ENVIRONMENT_NAME="my-container-apps-env"
ROUTE_CONFIG_NAME="my-route-config"

Creare app contenitore

  1. Eseguire il comando seguente per creare la prima app contenitore. Questa app di container utilizza l'immagine di avvio rapido di Container Apps.

    az containerapp up \
      --name $CONTAINER_APP_1_NAME \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --environment $ENVIRONMENT_NAME \
      --image $CONTAINER_APP_1_IMAGE \
      --target-port $CONTAINER_APP_1_TARGET_PORT \
      --ingress external \
      --query properties.configuration.ingress.fqdn
    
  2. Eseguire il comando seguente per creare la seconda app contenitore. Questa app contenitore usa l'immagine di avvio rapido ASP.NET.

    az containerapp up \
      --name $CONTAINER_APP_2_NAME \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --environment $ENVIRONMENT_NAME \
      --image $CONTAINER_APP_2_IMAGE \
      --target-port $CONTAINER_APP_2_TARGET_PORT \
      --ingress external \
      --query properties.configuration.ingress.fqdn
    
  3. Creare la configurazione della route HTTP.

    Creare il file seguente e salvarlo come routing.yml.

    rules:
      - description: App 1 rule
        routes:
          - match:
              prefix: /app1
            action:
              prefixRewrite: /
        targets:
          - containerApp: my-container-app-1
      - description: App 2 rule
        routes:
          - match:
              path: /app2
            action:
              prefixRewrite: /
          - match:
              path: /
        targets:
          - containerApp: my-container-app-2
    

    Questa configurazione definisce due regole di routing per il traffico HTTP.

    Annotazioni

    L'ordine delle regole di routing è importante.

    I prefissi più specifici devono essere prima di prefissi meno specifici.

    Ad esempio, se la prima regola corrisponde al prefisso /api, verrà usata anche se la seconda regola usa il prefisso /api/v1.

    Proprietà Descrizione
    description Etichetta leggibile per la regola
    routes.match.prefix Prefisso del percorso URL da trovare. Ad esempio: /api.
    routes.action.prefixRewrite Cosa sostituire il prefisso corrispondente con prima dell'inoltro.
    targets.containerApp Nome dell'app contenitore in cui vengono inviate le richieste di percorsi corrispondenti.

    Queste regole consentono a percorsi diversi del tuo dominio di instradarsi verso diverse app container, anche modificando il percorso della richiesta prima che raggiunga l'app di destinazione.

    Altre proprietà non elencate che possono influire sulle route includono quanto segue.

    Proprietà Descrizione
    route.match.path Definizione esatta del percorso di corrispondenza.
    route.match.pathSeparatedPrefix Trovare le route sui limiti "/" anziché su qualsiasi testo. Ad esempio, se si imposta il valore su /product, il valore corrisponderà a /product/1, ma non /product1a .
    route.match.caseSensitive Controllare se i modelli di route corrispondono o meno alla distinzione tra maiuscole e minuscole.
    target.label Indirizzare a una revisione etichettata specifica all'interno di un'app contenitore.
    target.revision Reindirizzare a una revisione specifica all'interno di un'applicazione container.
  4. Eseguire il comando seguente per creare la configurazione della route HTTP.

    az containerapp env http-route-config create \
      --http-route-config-name $ROUTE_CONFIG_NAME \
      --resource-group $RESOURCE_GROUP \
      --name $ENVIRONMENT_NAME \
      --yaml routing.yml \
      --query properties.fqdn
    

    Il nome di dominio completo (FQDN) della configurazione della route HTTP è simile all'esempio seguente: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io

  1. Verificare che entrambe le app contenitore esistano già.

  2. Creare il file Bicep seguente e salvarlo come routing.bicep.

    resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2024-10-02-preview' = {
      name: 'my-container-apps-env'
      location: 'eastus'
      tags: {}
      properties: {
        workloadProfiles: [
            {
                workloadProfileType: 'Consumption'
                name: 'Consumption'
            }
        ]
      }
    }
    
    resource httpRouteConfig 'Microsoft.App/managedEnvironments/httpRouteConfigs@2024-10-02-preview' = {
      parent: containerAppsEnvironment
      name: 'my-route-config'
      location: 'eastus'
      properties: {
        rules: [
            {
                description: 'App 1 rule'
                routes: [
                    {
                        match: {
                            prefix: '/app1'
                        }
                        action: {
                            prefixRewrite: '/'
                        }
                    }
                ]
                targets: [
                    {
                        containerApp: 'my-container-app-1'
                    }
                ]
            }
            {
                description: 'App 2 rule'
                routes: [
                    {
                        match: {
                            path: '/app2'
                        }
                        action: {
                            prefixRewrite: '/'
                        }
                    }
                    {
                        match: {
                            path: '/'
                        }
                    }
                ]
                targets: [
                    {
                        containerApp: 'my-container-app-2'
                    }
                ]
            }
        ]
      }
    }
    
    output fqdn string = httpRouteConfig.properties.fqdn
    
  3. Distribuire il file Bicep con il comando seguente:

    az deployment group create `
      --name $ROUTE_CONFIG_NAME `
      --resource-group $RESOURCE_GROUP `
      --template-file routing.bicep
    
  4. Nell'output, trovare outputs, che contiene il nome di dominio completo (FQDN) della configurazione della route HTTP. Per esempio:

        "outputs": {
          "fqdn": {
            "type": "String",
            "value": "my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io"
          }
        },
    

Verificare la configurazione della route HTTP

  1. Passare al nome di dominio completo di configurazione del percorso HTTP con il percorso /app1.

    Ad esempio: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io/app1.

    Viene visualizzata l'immagine di avvio rapido app contenitore.

  2. Passare al nome di dominio completo di configurazione del percorso HTTP con il percorso /app2.

    Ad esempio: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io/app2.

    Viene visualizzata l'immagine di avvio rapido ASP.NET.

Pulire le risorse

Se non si intende continuare a usare questa applicazione, eseguire il comando seguente per eliminare il gruppo di risorse insieme a tutte le risorse create in questa guida introduttiva.

Attenzione

Nell'esempio seguente, il gruppo di risorse specificato e tutte le risorse al suo interno vengono eliminati. Se le risorse esterne all'ambito di questa guida introduttiva esistono nel gruppo di risorse specificato, verranno eliminate anche.

az group delete --name my-container-apps