使用基於規則的路由搭配 Azure 容器應用程式

在本文中,您將瞭解如何搭配 Azure 容器應用程式 使用以規則為基礎的路由。 使用基於規則的路由,您可以在您的容器應用程式環境中建立完全限定的網域名稱 (FQDN)。 然後,您會根據每個要求的路徑,使用規則將此 FQDN 的要求路由傳送至不同的容器應用程式。

路由與授權模型

HTTP 路由設定httpRouteConfigs()在容器應用程式的環境層級運作。 路由可以針對同一環境中的任何容器應用程式,無論目標應用程式的個別入口設定為何。 由於路由的 FQDN 發布於環境的網域下,路由可以提供一個公開入口點,將請求轉發給使用內部入口(external: false)的容器應用程式。 這種行為使多個應用程式能夠在同一主機下組合。

HTTP 路由設定的權限範圍是針對受管理環境,而非個別容器應用程式。 建立、更新或刪除路由都需要環境 Microsoft.App/managedEnvironments/httpRouteConfigs/write 授權。 目標容器應用程式不需要額外權限。 這種行為符合環境為共享信任邊界的情況,即環境中所有容器應用程式都屬於同一客戶。 任何具有環境範圍且包含 httpRouteConfigs/write 權限的角色(例如 環境貢獻者 )的主體,都可以建立針對該環境中任何容器應用程式的路由。

Important

HTTP 路由設定可以暴露一個容器應用程式,該應用程式使用內部入口(external: false)作為路由目標。 這個 external: false 設定控制應用程式自身 FQDN 的可見性。 透過此配置,環境不會阻止應用程式透過環境層級路由接收流量。 為了讓容器應用程式無法從外部環境存取,請不要在任何 HTTP 路由設定中將其作為目標參考。 相反地,將應用程式放在沒有公開路由的獨立環境中,或使用網路層級的控制來限制入站流量。

先決條件

設定

  1. 執行下列命令,以便從 CLI 登入 Azure。

    az login
    
  2. 若要確定您執行的是最新版本 CLI,請執行升級命令。

    az upgrade
    

    忽略目前使用中模組的任何警告。

  3. 現在已安裝目前的延伸模組或模組,請註冊 Microsoft.App 和 Microsoft.OperationalInsights 命名空間。

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

建立環境變數

建立下列環境變數。

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"

建立容器應用程式

  1. 執行下列命令以建立您的第一個容器應用程式。 此容器應用程式會使用容器應用程式快速入門映像。

    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. 執行下列命令來建立您的第二個容器應用程式。 此容器應用程式會使用 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. 建立 HTTP 路由設定。

    建立下列檔案,並將它儲存為 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
    

    此組態會定義 HTTP 流量的兩個路由規則。

    備註

    路由規則的順序很重要。

    更具體的前綴應該放在較不具體的前綴之前。

    例如,如果第一條規則與前綴 /api 相符,即使第二條規則使用前綴 /api/v1,該規則仍會被使用。

    財產 說明
    description 可供人閱讀的規則標籤
    routes.match.prefix 要相符的 URL 路徑前置詞。 例如: /api 。
    routes.action.prefixRewrite 在轉送之前,要用來取代相符前置詞的項目。
    targets.containerApp 傳送相符路由要求的容器應用程式名稱。

    這些規則允許網域上的不同路徑路由至不同的容器應用程式,同時修改要求路徑,再到達目的地應用程式。

    未列出可能會影響路由的其他屬性包括下列內容。

    財產 說明
    route.match.path 完全相符的路徑定義。
    route.match.pathSeparatedPrefix 匹配『/』界限上的路由,而不是任何文字。 例如,如果您將值設定為 /product,則會比對 /product/1,但不會比對 /product1。
    route.match.caseSensitive 控制路由模式的比對是否要區分大小寫。
    target.label 路由至容器應用程式內的特定已標記修訂。
    target.revision 路由至容器應用程式內的特定修訂。
  4. 執行下列命令以建立 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
    

    HTTP 路由設定的完全限定網域名稱 (FQDN) 看起來像下列範例:my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io

  1. 請確定這兩個容器應用程式都已經存在。

  2. 建立下列 Bicep 檔案,並將儲存為 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. 使用下列命令部署 Bicep 檔案:

    az deployment group create `
      --name $ROUTE_CONFIG_NAME `
      --resource-group $RESOURCE_GROUP `
      --template-file routing.bicep
    
  4. 在輸出中尋找 outputs,其中包含 HTTP 路由組態的完整網域名稱 (FQDN)。 例如:

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

確認 HTTP 路由設定

  1. 使用路徑 /app1 瀏覽至 HTTP 路由組態 FQDN。

    例如: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io/app1 。

    您會看到 Container Apps 快速入門映像。

  2. 使用路徑 /app2 瀏覽至 HTTP 路由組態 FQDN。

    例如: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io/app2 。

    您會看到 ASP.NET 快速入門映像。

清理資源

如果您不打算繼續使用此應用程式,請執行下列命令來刪除資源群組,以及本快速入門中建立的所有資源。

謹慎

下列命令會刪除指定的資源群組和其中包含的所有資源。 如果本快速入門範圍以外的資源存在於指定的資源群組中,也會加以刪除。

az group delete --name my-container-apps