【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
在處理 Azure OpenAI Service(AOAI)資源時,強烈建議使用 API Management 來作為中介層,這也是微軟在建議提供一個具 SLA 等級的營運服務該有的基本架構之一,確實好處還不少,包括強大功能來滿足營運或商轉所需並提供安全可靠的解決方案,例如提供統一的介面(API Consumer, Provider)與 L7 層的一些防護,讓使用者可以輕鬆存取多個後端 AOAI 資源,其他好處還包括:
- 負載平衡和故障切換:當使用者存取 APIM 的端點時,APIM 可以對後端的多個 AOAI 資源進行負載平衡。這意味著即使某些 AOAI 資源不可用或超出速率限制,APIM 仍然可以將流量導向可用的資源,從而保證服務的持續性和可用性
- 地理位置和區域性:若是跨國企業話,Azure 允許在多個區域內部署 AOAI 資源。通過 APIM,可以根據使用者位置或流量來自動選擇最近和最合適的 AOAI 資源,從而減少延遲並提升性能
- 錯誤處理和監控:APIM 提供了強大的錯誤處理機制和監控工具。它能夠即時偵測到後端 AOAI 資源的錯誤或不可用情況,並採取適當的措施,如自動切換到其他可用資源或發出警報,以便團隊能夠及時介入解決問題
- 安全性和授權: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
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 方式取得認證!