Použití směrování založeného na pravidlech se službou Azure Container Apps

V tomto článku se dozvíte, jak používat směrování založené na pravidlech se službou Azure Container Apps. Pomocí směrování založeného na pravidlech vytvoříte plně kvalifikovaný název domény (FQDN) v prostředí kontejnerových aplikací. Potom použijete pravidla ke směrování požadavků pro tento plně kvalifikovaný název domény do různých kontejnerových aplikací v závislosti na cestě jednotlivých požadavků.

Model směrování a autorizace

HTTP konfigurace tras (httpRouteConfigs) fungují na úrovni prostředí Container Apps. Trasa může cílit na jakoukoli kontejnerovou aplikaci ve stejném prostředí, bez ohledu na individuální nastavení vstupu cílové aplikace. Protože FQDN trasy je publikován pod doménou prostředí, může trasa poskytnout veřejný vstupní bod, který přeposílá požadavky do kontejnerové aplikace využívající interní vstupní kanál (external: false). Toto chování umožňuje složení více aplikací pod jedním hostitelem.

Oprávnění pro konfigurace HTTP tras jsou omezena na spravované prostředí, nikoli na jednotlivé kontejnerové aplikace. Vytvoření, aktualizace nebo smazání trasy vyžaduje Microsoft.App/managedEnvironments/httpRouteConfigs/write povolení k prostředí. Na cílové kontejnerové aplikaci není potřeba žádné další oprávnění. Toto chování je v souladu s tím, že prostředí je sdílenou hranicí důvěry, kde všechny kontejnerové aplikace v prostředí patří stejnému zákazníkovi. Každý principal s rolí zaměřenou na prostředí, která zahrnuje httpRouteConfigs/write oprávnění, například Contributor v prostředí, může vytvářet trasy, které cílí na jakoukoli kontejnerovou aplikaci v daném prostředí.

Important

HTTP konfigurace trasy může odhalit kontejnerovou aplikaci, která používá interní vstupní (external: false), pokud aplikaci nakonfigurujete jako cílovou trasu. Toto nastavení ovládá external: false viditelnost vlastního FQDN aplikace. Použitím této konfigurace prostředí nebrání aplikaci přijímat provoz přes trasu na úrovni prostředí. Aby byla kontejnerová aplikace nedostupná zvenčí prostředí, neodkazujte na ni jako na cíl v žádné konfiguraci HTTP trasy. Místo toho umístěte aplikaci do samostatného prostředí bez veřejných tras, nebo použijte síťové ovládání k omezení příchozího provozu.

Požadavky

Nastavení

  1. Spusťte následující příkaz, abyste se přihlásili k Azure z rozhraní příkazového řádku.

    az login
    
  2. Pokud chcete zajistit, že používáte nejnovější verzi rozhraní příkazového řádku, spusťte příkaz upgrade.

    az upgrade
    

    Ignorujte všechna upozornění na aktuálně používané moduly.

  3. Teď, když je nainstalováno aktuální rozšíření nebo modul, zaregistrujte obory názvů Microsoft.App a Microsoft.OperationalInsights.

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

Vytvořte proměnné prostředí

Vytvořte následující proměnné prostředí.

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"

Vytváření kontejnerových aplikací

  1. Spuštěním následujícího příkazu vytvořte první aplikaci kontejneru. Tato aplikace kontejneru používá image rychlého startu pro 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. Spuštěním následujícího příkazu vytvořte druhou aplikaci kontejneru. Tato aplikace kontejneru používá image rychlého startu 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. Vytvořte konfiguraci trasy HTTP.

    Vytvořte následující soubor a uložte ho jako 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
    

    Tato konfigurace definuje dvě pravidla směrování pro provoz HTTP.

    Poznámka:

    Záleží na pořadí pravidel směrování.

    Konkrétnější předpony musí být před méně konkrétními předponami.

    Pokud například první pravidlo odpovídá předponě /api, použije se i v případě, že druhé pravidlo používá předponu /api/v1.

    Vlastnictví Popis
    description Popisek pro pravidlo čitelný pro člověka
    routes.match.prefix Předpona cesty url, která se má shodovat. Například: /api.
    routes.action.prefixRewrite Čím nahradit shodnou předponu před předáním.
    targets.containerApp Název aplikace kontejneru, ve které se odešle odpovídající požadavek na trasu.

    Tato pravidla umožňují různým cestám ve vaší doméně směrovat do různých kontejnerových aplikací a zároveň upravit cestu požadavku před dosažením cílové aplikace.

    Mezi další vlastnosti, které nejsou uvedené, které by mohly ovlivnit vaše trasy, patří následující.

    Vlastnictví Popis
    route.match.path Přesná shoda definice cesty.
    route.match.pathSeparatedPrefix Porovnává trasy na hranicích znaků '/' místo jakéhokoli jiného textu. Pokud například nastavíte hodnotu na /product, bude se shodovat s /product/1, ale ne s /product1.
    route.match.caseSensitive Určuje, zda vzory tras odpovídají citlivosti na malá a velká písmena.
    target.label Směrování na konkrétní označenou revizi v rámci kontejnerové aplikace
    target.revision Směrování k určité revizi uvnitř kontejnerové aplikace
  4. Spuštěním následujícího příkazu vytvořte konfiguraci trasy 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
    

    Plně kvalifikovaný název domény (FQDN) vaší konfigurace trasy HTTP vypadá takto: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io

  1. Ujistěte se, že obě aplikace typu kontejner už existují.

  2. Vytvořte následující soubor Bicep a uložte ho jako 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. Nasaďte soubor Bicep pomocí následujícího příkazu:

    az deployment group create `
      --name $ROUTE_CONFIG_NAME `
      --resource-group $RESOURCE_GROUP `
      --template-file routing.bicep
    
  4. Ve výstupu najděte outputs, který obsahuje plně kvalifikovaný název domény (FQDN) konfigurace trasy HTTP. Například:

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

Ověření konfigurace trasy HTTP

  1. Přistupte k FQDN konfigurace vaší HTTP trasy s cestou /app1.

    Například: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io/app1.

    Zobrazí se obraz rychlého startu Container Apps.

  2. Přistupte k FQDN konfigurace vaší HTTP trasy s cestou /app2.

    Například: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io/app2.

    Zobrazí se obrázek rychlého startu ASP.NET.

Čištění zdrojů

Pokud tuto aplikaci nebudete dál používat, spuštěním následujícího příkazu odstraňte skupinu prostředků spolu se všemi prostředky vytvořenými v tomto rychlém startu.

Upozornění

Následující příkaz odstraní zadanou skupinu prostředků a všechny prostředky obsažené v ní. Pokud prostředky mimo rozsah tohoto rychlého startu existují v zadané skupině prostředků, odstraní se také.

az group delete --name my-container-apps