【How-to Guides】Azure APIM — Enhancing Security and Efficiency of AI Services(Azure OpenAI)

Build an enterprise-ready Azure OpenAI solution with Azure API Management

Kellen
8 min readJul 13, 2024

繼續前篇內容
📕 【Tutorial】Azure APIM — API management 功能介紹

在處理 Azure OpenAI Service(AOAI)資源時,強烈建議使用 API Management 來作為中介層,這也是微軟在建議提供一個具 SLA 等級的營運服務該有的基本架構之一,確實好處還不少,包括強大功能來滿足營運或商轉所需並提供安全可靠的解決方案,例如提供統一的介面(API Consumer, Provider)與 L7 層的一些防護,讓使用者可以輕鬆存取多個後端 AOAI 資源,其他好處還包括:

  1. 負載平衡和故障切換:當使用者存取 APIM 的端點時,APIM 可以對後端的多個 AOAI 資源進行負載平衡。這意味著即使某些 AOAI 資源不可用或超出速率限制,APIM 仍然可以將流量導向可用的資源,從而保證服務的持續性和可用性
  2. 地理位置和區域性:若是跨國企業話,Azure 允許在多個區域內部署 AOAI 資源。通過 APIM,可以根據使用者位置或流量來自動選擇最近和最合適的 AOAI 資源,從而減少延遲並提升性能
  3. 錯誤處理和監控:APIM 提供了強大的錯誤處理機制和監控工具。它能夠即時偵測到後端 AOAI 資源的錯誤或不可用情況,並採取適當的措施,如自動切換到其他可用資源或發出警報,以便團隊能夠及時介入解決問題
  4. 安全性和授權:APIM 提供了身份驗證和授權機制,保護 AOAI 資源免受未經授權的訪問

Architecture accelerator

使用 Azure API management(單一與多區域部署架構)

接續來實作怎麼將 APIM 與 AOAI 作一個連接

前置作業

準備 Azure OpanAI 可用資源

  • 已在該區域建立名為「openai-demo」的 AOAI 資源,例如其端點為https://openai-demo.openai.azure.com/
  • 部署 gpt-35-turbo 同名的模型 gpt-35-turbo
  • 已經擁有一份有效 API 金鑰 api-key

Azure OpenAI Service REST API

Creates a completion for the chat message

這個 URL 是用來向特定 API 端點發送 POST 請求,意即向某個部署在 OpenAI 平台上的模型發送請求,以獲取完成文本(completions)的功能

APIM 作業設定

APIM 的基本流程,它將從 API 呼叫到回應的過程分成幾個階段。

  • 前端:HTTP 方法和 URL 路徑
  • 入站處理:在傳送到後端之前的一些功能,例如限流、JWT、IP 限制等
  • 後端:後端的 HTTP(s) 端點,這邊置入相關 OpenAI 的 URL
  • 出站處理:在將回應傳送到客戶端之前修改回應

Create from Azure Resource:並選擇 Azure OpenAI

黃框為系統會自動連動到你建立好的 APIM 的 BaseURL

Design

點選 🖊️ 進入編輯,這邊把一些 Headers, Query, Response 都先定義好,並選擇適的 inbound policy 使用

Setting

確認相關資訊,可以從 Web service URL(即 OpenAI)、API URL(即 APIM 並加入 suffix 來區別不同 API 也是不錯的作法)

路徑連通性

Host: {APIM name}.azure-api.net

使用 Named values 保存 secret

在 Named value 中保存「api-key」的關鍵資訊。執行此操作時,請確保選擇 “secret” 作為其類型。出於功能演示,但記得「Key Vault」比「Secret」更好,使用 「managed identity」 身份認證又比 Key Vault 更佳,後面會帶到 managed identity 來取代 OpenAI api-key 的認證。

Test

切換到 Test 功能,就滿方便使用

POST https://hello-apim-world.azure-api.net/openai-demo/deployments/gpt-35-turbo/chat/completions?api-version=2024-02-15-preview HTTP/1.1
Host: hello-apim-world.azure-api.net
Content-Type: application/json

{
"messages": [{"role": "user", "content": "Tell me about Azure OpenAI Service."}]
}

啟用 managed identity 作為存取 OpenAI 認證

先 enable System assigned Managed Identity

將 AOAI 資源中的角色指派給 APIM 的託管身分。前往 AOAI 資源中的 Access Control(IAM),然後選擇 ✚Add 中的 Add role assignment

可以先輸入「OpenAI」縮小角色範圍,選擇「Cognitive Services OpenAI User」角色。此角色最適合擁有關聯的託管身分以從 AOAI API 取得資訊

接下來,修改策略,以便 APIM 使用 Azure AD 進行驗證。前往入站處理策略畫面。修改策略如下。

<policies>
<inbound>
<base />
<authentication-managed-identity resource="https://cognitiveservices.azure.com" output-token-variable-name="msi-access-token" ignore-error="false" />
<set-header name="Authorization" exists-action="override">
<value>@("Bearer " + (string)context.Variables["msi-access-token"])</value>
</set-header>

因使用 Azure AD 進行安全性驗證<authentication-managed-identity>,並將獲得的令牌(比 API 金鑰更安全,因為它是短暫的)儲存在 msi-access-token 變數中。接下來,Authorization 使用新增標頭 <set-header>。這被設定為 Bearer 令牌。最後,從策略中刪除所有 API 金鑰。

測試一下後是成功的,透過 Azure AD 驗證與 AOAI API 進行通訊,再次提升了安全性和管理 API Key 這類不必要的工作而浪費時間。

驗證一下 log 相關資訊,確實是走短時效的 Token 方式取得認證!

--

--

Kellen

Backend(Python)/K8s and Container eco-system/Technical&Product Manager/host Developer Experience/早期投入資料創新與 ETL 工作,近期研究 GCP/Azure/AWS 相關的解決方案的 implementation