【Tutorial】Azure APIM — API management 功能介紹

Introduction to Azure APIM: Managing Your APIs

Kellen
19 min readJul 13, 2024
Azure API management 可與各種後端服務(如 Azure Functions、Azure logic app 和 Azure VM)以及本機和第三方系統結合使用。可以幫助開發人員以安全、可擴展且易於使用的方式建立和管理 API

什麼是 Azure API management?

Azure API management 是 Azure 提供的託管的服務,可協助開發人員安全地將其 API 公開給外部和內部客戶。它提供了一組用於建立、發布和管理 API 以及增強安全性、擴展和監控 API 使用情況的工具和服務。API management 包括一系列功能和工具,例如 API Gateway、基於 Web 的開發人員入口網站、API 生命週期管理、監控和分析工具以及安全功能。基本上花些錢就可以省去開發或是堆疊一堆外掛工具才能達到以上的目的。

Azure API Management 滿足以下三種類型的使用者

  • API consumers
    提供了一種方便的方式來存取和使用由服務管理的 API
  • API providers
    對於 API 供應商,提供了一組用於建置、發布和管理 API 的工具和服務
  • Application developers
    提供了一種在應用程式中存取和使用 API 的便捷方法,包括 API 的詳細文檔,包括 API 端點資訊、支援的 operation、請求和回應格式以及任何所需的參數或標頭

API management 提供哪些主要功能?

Azure API Management is made up of an API gateway, a management plane, and a developer portal. These components are Azure-hosted and fully managed by default. API Management is available in various tiers differing in capacity and features.

Developer Portal / API Gateway / Publisher Portal
Azure API Management visually explained

大致提供三種主要功能,目的是使 API 的設計、部署和管理變得更容易的環境,而讓 Backend API Developer 可以專注在 API 的開發,而不需各自處理或加工一些安全、認證及出於管理另外疊加 API 功能。

來自客戶端應用程式的所有請求首先到達 API Gateway,然後將它們轉發到相應的後端服務。 API Gateway 可作為後端服務的外觀,可讓 API 提供者抽象化 API 實作並發展後端架構,而不會影響 API consumer。此 Gateway 支援路由、安全性、限制、快取和可觀察性的一致配置。

開發者入口網站 Develpoer Portal

API 開發人員可以透過開發人員入口網站存取其已發布的 API。

  • 閱讀自動產生的 API 文件,例如存取 Swagger Open API。元資料或 WADL 文件 (XML)
  • 存取用於使用 Java、C# 等語言存取 API 的程式碼範例
  • Developer support. Log bugs/issues with the API.

API Gateway

API Gateway 是位於後端服務前面的伺服器(代理程式)端點。其主要目的是透過以下方式確保存取安全:

  • 透過使用配額和限制來限制 API 請求
  • API 金鑰和其他憑證(例如憑證、JWT 令牌驗證)的存取控制。
  • 緩存響應
  • 記錄分析數據

ADMINISTRATION PORTAL

發布者入口網站提供管理介面來管理您的 API 程式

  • 儀表板:查看您發布的 API、趨勢和運行狀況
  • 產品:將 API 作為產品進行管理
  • 管理和實施速率限制等政策
  • Developers:新增和刪除用戶
  • 分析:監控 API 使用情況和運作狀況

當 API 開始使用時,我們必須透過效能和監控進行必要的改進,並確保 API服務順利。

與 Azure Load Balancer 系列工具搭配使用

Azure Load Balancer, Application Gateway, Azure Front Door, Traffic Manager

API Management 提供 API 的管理、安全性和分析功能,搭配 Azure 負載平衡器可提高性能和可用性。Azure Load Balancer 分發流量至多個 API Management instance;Application Gateway 提供 SSL 驗證、WAF 和 URL 路由;Azure Front Door 在全球範圍內加速和分配流量;Traffic Manager 基於 DNS 進行全球流量管理,這些工具共同保障 API 的高性能和安全性。

消費套餐的前 100 萬次是免費的,採用即用即付模式,但有一些限制。例如,開發者入口網站、虛擬網路、自動縮放等功能在這邊都不能用。您只能在 Azure 訂閱中建立20 個消費計畫API 管理服務。每個消費層服務最多可以管理 50 個 API。

Azure Load Balancing Interview Questions : ChatGPT Answers

Architecture accelerator

在微軟提供建議架構,可以看到透過 Azure API management 提供的 API 的存取,並將後端元件以 Private Link 的設定成走微軟 backbone 的方式。前面對外的流量會在 Azure App Gateway 的幫助,作為對外防禦,並與 API management 互相搭配來管理內部和外部 API。

Pricing 說明

此篇會先以 Consumption 來演示,但是留意此 Tier 並無提供 Developer Portal。

API management 功能開箱(Consumption spec.)

建議剛接觸的新手可先從這幾個功能了解,若有商用目的,可預先設計好自己的訂閱 > 產品 > API 結構。

  1. API:這是我們進行 API 定義的部分。客戶端為 HTTP 請求而使用的端點定義被製作成 API。例如 ListProduct, GetProduct, DeleteProduct.
  2. Products:可以將 API 分組,Products 用於組織和管理多個 API,並應用特定的策略(Policy)來控制其行為並替 Products 制作 Policy 或 Subscription
  3. Subscription:非 Azure 計費的訂閱喔!Subscriptions 是用於向 API 發出請求的訂閱金鑰。開發者或用戶通過訂閱獲取金鑰,這些金鑰用於驗證和授權 API 請求,以確保安全性。在建立訂閱時,可以選擇所有 API、特定產品或特定 API
  4. Named Values:我們可以將其視為鍵值儲存,這邊保留將使用的 values
  5. Backends:我們的 API 是我們管理後端服務的資源的部分,可以自定義或 Azure 資源

Products / Subscription 關聯與設計思考

Products:用於組織和管理一組相關的 API,並應用策略來控制其行為。
Subscriptions:向 API 發出請求的訂閱金鑰,用於驗證和授權 API 請求,確保安全性。

例如一個電子商務平台可以創建兩個產品 ”Public APIs” 和 “Partner APIs”。Public APIs 包含公開給所有用戶使用的 API,而 Partner APIs 則包含僅供合作夥伴使用的 API,每個產品可以應用不同的安全和流量控制策略。

一個開發者訂閱了 “Public APIs”,獲得一個訂閱金鑰,這個金鑰允許他們訪問所有在 “Public APIs” 產品中的 API。如果需要訪問 “Partner APIs”,則需要另行訂閱💰並獲取相應的訂閱金鑰。

可以理解成 Products 是組織和分類我們提供的 API 產品,展示我們的 API 目錄;而至於 Subscriptions 決定如何向使用者提供 API 訪問權限,通過訂閱金鑰確保 API 的安全和授權,下圖是鳥瞰 Key Features 重要 diagram。

展開實作的第一步

👶 了解 Azure API 管理術語
👶 快速入門:使用 Azure 入口網站建立新的 Azure APIM 執行個體
👶
教學課程:匯入和發佈您的第一個 API

設定 API Management

👣 Step01. 從 Azure 入口網站功能表選取 [建立資源] 選 API Management

👣 Step02. 建立 API management

API 上架說明

使用範例:Demo Conference API
這個 API 主要用於提供與技術會議相關的資訊,包括會議的詳細資料、演講者的資訊以及主題的概述。開發者可以利用這個 API 構建應用程序或網站,來顯示會議日程、演講者名單和主題摘要,並讓用戶提交會議反饋。

OpenAI spec:https://conferenceapi.azurewebsites.net/?format=json,背後使用了 Azure Web 服務 (conferenceapi.azurewebsites.net) 作為主機。規格提供了基於 Swagger 2.0 規範定義的 API 文檔。

具體 operation 示例

  • 獲取所有會議資訊:GET /sessions
  • 根據 ID 獲取會議資訊:GET /session/{id}
  • 提交會議反饋:POST /session/{id}/feedback
  • 獲取所有演講者資訊:GET /speakers
  • 根據 ID 獲取演講者資訊:GET /speaker/{id}

👣 Step01. 設定 OpenAPI spec

匯入後即帶出 Demo Conference API 與項下所有 Operation API endpoint。

圖一:至 API > Design > All Operations 查看建立好 operation(藍框),紅框可看到 API Management 主要提供是 L7(應用層)保護,在 Inbound processing 可加不少保護機制,常見有 limit call rate, filter ip address, cache response 都滿推薦,互相搭配以確保 API 的安全性、可靠性和可用性

👣 Step02. 架構第一個 Product 產品目錄

建立一個 Starter 作為 API developer 在開發上的使用,並將上步驟的 Demo Conference API 與此產品作聯結

👣 Step03. Subscription

例如我們今天是一個營運線上 AI Service 的新創公司,對於 Third-Party 共同開發的 Developer 夥伴都提供此 Starter Subscription 並與剛在 👣 Step02 建好的 Starter Product 作聯結。

當然在 Scope 也可以選擇 API 直接帶到 Conference Demo API,只是此篇設計邏輯希望從 Subscription(商業層) > Products(產品目錄層)> API 層(不同主題 API, e.g., ChatGPT, OCR, Video),然後 API 層下層展開才是不同的 Operation。

👣 Step04. 了解 Policies 在 API management 的作用

Policies 策略定義是一個 XML 文檔,描述每個 API 或每個 API 操作的入站和出站語句序列。可以直接在 Azure Web 視窗中編輯,Policy 也有身份驗證方法、限制、限制呼叫率、快取、轉換等策略。例如可以使用訂閱金鑰、JSON Web 令牌 (JWT)、用戶端憑證或自訂標頭對 API 請求進行驗證。流量只能透過受信任的 IP 位址進行過濾。

The policy XML configuration is divided into inbound, backend, outbound, and on-error sections. This series of specified policy statements is executed in order for a request and a response.

Policies in Azure API Management
Understanding policy configuration

另一個重要觀念是,API management 可讓您在以下範圍(從最廣泛到最狹窄)定義 Policies

  • Global(所有 API)
  • Workspace(與選定工作區關聯的所有 API)
  • Product(與所選產品關聯的所有 API)
  • API(API 中的所有操作)
  • Operation(API 中的單一操作)

實際運作如下

👣 Step05. Policy 功能引入與設定

可以看到 👣Step01 中的圖一,有不少的選擇可以針對 Inbound / Outbound processing 處理 request / response 的一些機制(Policy)

For Example1
如果需要過濾 IP 位址,可以使用 IP 過濾策略。此策略過濾(允許/拒絕)來自特定 IP 位址和/或位址範圍的呼叫。

<ip-filter action="allow | forbid">
<address>address</address>
<address-range from="address" to="address" />
</ip-filter>

Policies 可以 Global 配置,也可以在 Products, API Operation 內配置。若要開始配置 Policies,您必須先選擇 Policies 套用的範圍,也推薦幾個如快取、限流等,也呼應前面提到的 API Developer 不用累的像狗要實作這些機制,專心在 API 開發與微服務的設計上。

For Example2 — 限速與 Cache

For Example3:Outbound 時移除 Header

在 response 時可以看到 Header 有帶一個 x-powered-by,試著將他移除!

設定如下 Name 會自動帶出並在 Action 選擇 delete

結果查看,確實 Header 其中的 x-powered-by 被移除

Version vs Revision 篇

在 Azure API Management 中,Version(版本)和 Revision(修訂)是兩個重要的概念,用於管理和控制 API 的不同版本和修訂。理解這兩者的區別和使用情況,有助於更好地管理 API 的發展和變更。Version 通常指的是軟體或產品的一個具體的釋出版本,它標識了在開發過程中的一個特定里程碑或發布的時間點。而 Revision 指對現有版本的輕微更改或修復,通常不會引入新的功能,主要是為了改進已有功能或修正錯誤。

Version(版本)

  • Version 可讓您向開發人員展示相關 API 群組
  • 您可以使用 Version 來安全地處理 API 中的重大更改
  • 客戶可以選擇在準備好後使用您的新 API Version,而現有客戶則繼續使用舊版本
  • 版本透過版本識別碼進行區分,版本控制方案可讓客戶端識別他們想要使用的 API 版本

Revision(修訂)

  • Revision 可讓您以受控且安全的方式更改 API
  • 當您想要進行更改時,請建立新修訂版
  • 然後,您可以編輯和測試 API,而不會打擾您的 API 用戶 -> 準備好後,您可以將修訂版本設定為最新版本

👣 Step01. 新增一個 TestAPI

Policy 上我們將此 TestAPI 作為一個 Mock Response 不直接打向後端!

Mocking is enabled

👣 Step02. 新增 Revision

並留意一下目前切換的狀態在 Revision 2,而原本對外提供的 Developer Portal 仍舊看到的是 Revision 1(Current Status),因為還在測試還沒達到對外發佈的品質。

Online:修訂版本已部署,可供使用者和開發者實時測試和驗證 | Current:修訂版本是當前主要公開版本,所有使用者默認訪問這個版本

👣 Step03. 測試此 Revision 2 的 TestAPI

可觀察到我的 Request URL 在後綴為 /conf;rev=2/testtest 為 endpoint,在驗證完成後,若確認可以達到切換成上線的品質,進行下一步驟。

👣 Step04. 使 Revision 2 成為當前版本

是時候將這個具有提供 TestAPI 的 Revision 2 推向市場,只要切換版本讓 Revision 2 成為 Current 後(紅框 Make Current),在 Developer Portal 即可看到 TestAPI 並查閱 Change log 的資訊。

查看目前 Demo Conference API,使用者即可發現會多了一支 TestAPI 的 operation 可供使用。

Current:修訂版本是當前主要公開版本,所有使用者默認訪問這個版本

👣 Step05. API v1 → API v2 當 API 重構或破壞性變更

版本用於標識 API 的重大變更或功能集合的變化,當伴隨著破壞性變更(Breaking Changes),例如通常 API 推出的 v1 多為初始版本,包含基本功能;當市場變化導致產品要大改動時,可能會再推出 v2 版本的 API。

#1 現況 Online 版本為 ID=1

#2 從 Revision 作一個切出 v2 version 出來

#3 原本 Demo Conference API 出現了 v2

✨ 對於 Revision 可由 API Provider 來決定什麼時候要上線;而對比於 Version 則由 API Consumer 來決定什麼時候要切換。

排障

異常描述

無效的訂閱金鑰 (Invalid subscription key)

  • 錯誤訊息:Access denied due to invalid subscription key. Make sure to provide a valid key for an active subscription.
  • 原因:請求中包含了錯誤的訂閱金鑰。

缺少訂閱金鑰 (Missing subscription key)

  • 錯誤訊息:Access denied due to missing subscription key. Make sure to include subscription key when making requests to an API.
  • 原因:請求中沒有包含訂閱金鑰。

--

--

Kellen

Backend(Python)/K8s and Container eco-system/Technical&Product Manager/host Developer Experience/早期投入資料創新與 ETL 工作,近期堆疊 Cloud☁️ 解決方案並記錄實作與一些雲端概念💡