共用方式為


將 Azure APIM 自我裝載閘道部署至 Azure 容器應用程式

適用於:開發人員 | 進階

本文提供將 Azure APIM 自我裝載閘道元件部署至 Azure 容器應用程式的步驟。

將自我裝載閘道部署至容器應用程式,以存取裝載於相同 Azure 容器應用程式環境中的 API。

先決條件

在 Azure API 管理 執行個體中佈建閘道

在部署自我裝載閘道之前,請在 Azure APIM 執行個體中佈建閘道資源。 如需步驟,請參閱佈建自我裝載閘道。 在本文的範例中,閘道名為 my-gateway

從 APIM 取得閘道部署設定

若要部署閘道,您需要閘道的權杖組態端點值。 您可以在 Azure 入口網站中找到這些值:

  1. 登入 Azure 入口網站,然後移至您的 Azure API 管理 執行個體。
  2. 在左側功能表的 [部署 + 基礎結構] 底下,選取 [自我裝載閘道]。
  3. 選取您佈建的閘道資源,然後選取 [ 設定>] [部署]。
  4. 複製權杖組態端點值。

將自我裝載閘道部署至容器應用程式

您可以使用 Azure 入口網站Azure CLI 或其他工具,將自我裝載閘道容器映像部署到容器應用程式。 本文說明使用 Azure CLI 的步驟。

建立容器應用程式環境

首先,使用 az containerapp env create 命令建立容器應用程式環境:

#!/bin/bash
az containerapp env create --name my-environment --resource-group myResourceGroup \
    --location centralus

此指令會建立:

  • 名為 my-environment 的容器應用程式環境,用來將容器應用程式分組。
  • Log Analytics 工作區

建立自我裝載閘道的容器應用程式

若要將自我裝載閘道部署至環境中的容器應用程式,請執行 az containerapp create 命令。

首先,從 Azure API 管理 閘道資源設定 權杖組態端點 值的變數。

#!/bin/bash
endpoint="<API Management configuration endpoint>"
token="<API Management gateway token>"

使用 az containerapp create 命令建立容器應用程式:

#!/bin/bash
az containerapp create --name my-gateway \
    --resource-group myResourceGroup --environment 'my-environment' \
    --image "mcr.microsoft.com/azure-api-management/gateway:2.9.2" \
    --target-port 8080 --ingress external \
    --min-replicas 1 --max-replicas 3 \
    --env-vars "config.service.endpoint"="$endpoint" "config.service.auth"="$token" "net.server.http.forwarded.proto.enabled"="true"

此指令會建立:

  • my-gateway 資源群組中名為 myResourceGroup 的容器應用程式。 在此範例中,容器應用程式會使用 mcr.microsoft.com/azure-api-management/gateway:2.9.2 映像。 如需自架設閘道的詳細資訊,請參閱 容器映像

  • 支援連接埠 8080 上容器應用程式的外部輸入。

  • 容器應用程式的至少 1 個複本和最多 3 個複本。

  • 透過在環境變數中傳遞組態值,從自我裝載閘道連線到 Azure API 管理 實例。 如需詳細資訊,請參閱自我裝載閘道容器組態設定

    備註

    Azure 容器應用程式輸入會將 HTTPS 要求轉送至自我裝載閘道容器應用程式作為 HTTP。 在這裡,net.server.http.forwarded.proto.enabled 環境變數會設定為 true,讓自我裝載閘道使用 X-Forwarded-Proto 標頭來判斷要求的原始通訊協定。

確認容器應用程式正在執行

  1. 登入 Azure 入口網站,然後移至您的容器應用程式。

  2. 在容器應用程式的 [概觀] 頁面上,檢查 [狀態] 是否為 [正在執行]

  3. 將測試要求傳送至 /status-012345678990abcdef 上的狀態端點。 例如,使用像下列命令的 curl 命令。

    curl -i https://my-gateway.happyvalley-abcd1234.centralus.azurecontainerapps.io/status-012345678990abcdef
    

    成功的要求會傳回 200 OK 回應。

小提示

您也可以使用 CLI 執行 az containerapp show 命令來檢查容器應用程式的狀態。

確認閘道狀況良好

  1. 登入 Azure 入口網站 並移至您的 Azure API 管理 執行個體。

  2. 在左側功能表的 [部署 + 基礎結構] 底下,選取 [自我裝載閘道]。

  3. [概觀 ] 頁面上,檢查閘道的 [狀態]。 如果閘道狀況良好,它會報告一般閘道活動訊號。

    入口網站中閘道狀態的螢幕擷取畫面。

範例案例

下列範例示範如何使用自我裝載閘道來存取相同環境中容器應用程式中裝載的 API。 如下圖所示,您可以從網際網路存取自我裝載閘道,而 API 只能在容器應用程式環境內存取。

自我裝載閘道的範例案例圖表。

  1. 在與自我裝載閘道相同的環境中部署裝載 API 的容器應用程式。
  2. 將 API 新增至您的 Azure API 管理 執行個體。
  3. 透過自行裝載閘道呼叫 API。

在與自我裝載閘道相同的環境中部署裝載 API 的容器應用程式

在此範例中,您會將範例音樂專輯 API 部署至容器應用程式。 若要稍後使用自我裝載閘道存取 API,請在與自我裝載閘道相同的環境中部署 API。 如需此範例中所用資源的詳細步驟和資訊,請參閱快速入門:從本機原始程式碼建置和部署至 Azure 容器應用程式。 簡略步驟如下:

  1. Python 原始碼下載到本機電腦。 如果您想要的話,請以您選擇的其他語言下載原始程式碼。

  2. 將原始程式碼解壓縮至本機資料夾,並變更為 containerapps-albumapi-python-main/src 資料夾。

  3. 執行下列 az containerapp up 命令,將 API 部署至與自我裝載閘道相同環境中的容器應用程式。 請注意命令結尾的 .,它會指定目前資料夾作為容器應用程式的來源。

    #!/bin/bash
    az containerapp up --name albums-api \
        --resource-group myResourceGroup --location centralus \
        --environment my-environment --source .
    
  4. 確認容器應用程式正在執行,且可從命令輸出中傳回的 FQDN 外部存取。 根據預設,API 可在 /albums 端點存取。 範例: https://albums-api.happyvalley-abcd1234.centralus.azurecontainerapps.io/albums/albums.

設定內部輸入的 API

現在更新裝載範例 API 的容器應用程式,以只在容器環境中啟用輸入。 此設定只會限制從您部署的自我裝載閘道存取 API。

  1. 登入 Azure 入口網站,然後移至您的容器應用程式。
  2. 在左側功能表中,選取 網路>入口
  3. 將 [輸入] 設定為 [已啟用]
  4. 在 [輸入流量] 中,選取 [限制為容器應用程式環境]
  5. 檢閱其餘設定,然後選取 [儲存]

將 API 新增至 Azure API 管理 執行個體

下列步驟示範如何將 API 新增至 Azure API 管理 執行個體,並設定 API 後端。 如需詳細資訊,請參閱將 API 新增至 Azure APIM

將 API 新增至 APIM 執行個體

  1. 在入口網站中,移至您在其中設定自我裝載閘道的 API 管理執行個體。
  2. 在左側功能表中,選取 [API>>API + 新增 API]。
  3. 選取 [HTTP],然後選取 [完整]。 輸入下列設定:
    1. 顯示名稱:輸入描述性名稱。 範例:專輯 API
    2. Web 服務 URL:輸入裝載 API 之容器應用程式的內部 FQDN。 範例: http://albums-api.internal.happyvalley-abcd1234.centralus.azurecontainerapps.io.
    3. URL 配置:選取 [HTTP (S)]
    4. API URL 尾碼:輸入您選擇的尾碼。 範例:albumapi
    5. 閘道:選取您佈建的自我裝載閘道。 範例:my-gateway
  4. 根據您的案例設定其他 API 設定。 選取 ,創建

新增 API 作業

  1. 在左側功能表中,選取 [API]>[專輯 API]
  2. 選取 [+ 新增作業]
  3. 輸入工作設定:
    1. 顯示名稱:輸入作業的描述性名稱。 範例:取得專輯
    2. URL:選取 [取得],然後針對端點輸入 /albums
    3. 選取 [儲存]。

透過自我裝載閘道呼叫 API

使用容器應用程式中執行之自我裝載閘道的 FQDN 來呼叫 API。 在 Azure 入口網站的容器應用程式的 [概觀] 頁面上尋找 FQDN,或執行下列 az containerapp show 命令。

#!/bin/bash
az containerapp show --name my-gateway --resource-group myResourceGroup \
    --query "properties.configuration.ingress.fqdn" --output tsv

例如,執行下列 curl 命令以在 /albumapi/albums 端點呼叫 API。 如果您的 API 需要訂用帳戶金鑰,請在要求中將 APIM 執行個體的有效訂用帳戶金鑰傳遞為標頭:

curl -i https://my-gateway.happyvalley-abcd1234.centralus.azurecontainerapps.io/albumapi/albums -H "Ocp-Apim-Subscription-Key: <subscription-key>"

測試成功時,後端會以成功的 HTTP 回應碼和某些資料進行回應。

HTTP/1.1 200 OK
content-length: 751
content-type: application/json
date: Wed, 28 Feb 2024 22:45:09 GMT
[...]

[{"id":1,"title":"You, Me and an App Id","artist":"Daprize","price":10.99,"image_url":"https://aka.ms/albums-daprlogo"},{"id":2,"title":"Seven Revision Army","artist":"The Blue-Green Stripes","price":13.99,"image_url":"https://aka.ms/albums-containerappslogo"},{"id":3,"title":"Scale It Up","artist":"KEDA Club","price":13.99,"image_url":"https://aka.ms/albums-kedalogo"},{"id":4,"title":"Lost in Translation","artist":"MegaDNS","price":12.99,"image_url":"https://aka.ms/albums-envoylogo"},{"id":5,"title":"Lock Down Your Love","artist":"V is for VNET","price":12.99,"image_url":"https://aka.ms/albums-vnetlogo"},{"id":6,"title":"Sweet Container O' Mine","artist":"Guns N Probeses","price":14.99,"image_url":"https://aka.ms/albums-containerappslogo"}]

小提示

如果您啟用了將您的 API 日誌記錄到 Application Insights,您可以查詢記錄以查看要求和回應。

局限性

自我託管閘道執行個體依賴 UDP 通訊協定進行活動訊號和速率限制通訊。 因為 Azure 容器應用程式目前不支援 UDP 通訊協定 (無論是用於輸入或內部流量),所以 rate-limit 原則無法跨執行個體同步其計數器。 因此,維護具有限制 X 的自我裝載閘道容器應用程式的三個複本可能會導致流量增加三倍,直到達到限制 X 為止。

Azure 容器應用程式會在每個可用且狀況良好的複本之間線性散發要求。 若要實作速率限制,您可以將所需的限制除以您要執行的複本數目,並在組態中設定結果值。 此方式也有其缺點,因為當您的容器應用程式進行調整 (擴縮) 時,您可能無法正確計算已調整後的計數器。