編輯

共用方式為


虛擬網路整合無伺服器微服務

Azure API 管理
Azure Cosmos DB
Azure Functions
Azure 金鑰保存庫
Azure 虛擬網路

在此 Azure 解決方案中,Azure API 管理 (APIM) 會透過單一受控端點控制對 API 的存取。 應用程式後端是由兩個相互相依的 Azure Functions 微服務應用程式所組成,可建立和管理病患記錄和稽核記錄。 APIM 和兩個函式應用程式會透過鎖定的 虛擬網路彼此存取。

本文和相關聯的程式 代碼專案 會將範例案例縮減為主要技術元件,以做為特定實作的 Scaffolding。 此解決方案會使用 Terraform 自動執行所有程式代碼和基礎結構部署,並包含自動化整合、單元和負載測試。

架構

下圖顯示患者記錄建立要求流程:

顯示虛擬網路整合微服務的圖表。

下載此架構的 Visio 檔案

工作流程

  1. 外部服務和用戶端會向APIM提出POST要求,其中包含病患信息的數據本文。
  2. APIM 會使用指定的病患資訊,在病患 API 中呼叫 CreatePatient 函式。
  3. 病患 API 中的CreatePatient式會呼叫CreateAuditRecord稽核 API 函式應用程式中的 函式,以建立稽核記錄。
  4. Audit API CreateAuditRecord 函式會在 Azure Cosmos DB 中建立稽核記錄,並傳回病患 API CreatePatient 函式的成功回應
  5. CreatePatient 式會在 Azure Cosmos DB 中建立病患檔,並傳回 APIM 的成功回應。
  6. 外部服務和用戶端會收到來自 APIM 的成功回應。

元件

解決方案會使用下列元件:

  • Azure API 管理 (APIM) 是一個混合式、多雲端平臺,可用於管理所有環境的 API。 在此解決方案中,APIM 會控制患者 API 的內部和第三方存取,以允許讀取和/或寫入數據。 APIM 可讓您輕鬆地與不同的驗證機制整合。

  • Azure Functions 是無伺服器計算平臺,可處理小型的事件驅動程式代碼片段。 雲端基礎結構提供必要的更新伺服器,以大規模執行函式。 目前的解決方案會使用一組兩個 Azure Functions API 微服務,為病患測試結果和稽核記錄建立和管理作業。

  • Azure 虛擬網絡 藉由限制對特定IP位址或子網的網路存取,提供隔離且高度安全的應用程式環境。 APIM 和 Azure Functions 都支援虛擬網路中的存取限制和部署。 此解決方案會使用 區域虛擬網路整合 ,在相同區域中的相同虛擬網路中部署這兩個函式應用程式。

  • Azure 金鑰保存庫 會集中儲存、加密及管理金鑰、憑證和 連接字串 的存取權。 此解決方案會在只有指定身分識別的 金鑰保存庫 中維護 Azure Functions 主機密鑰和 Azure Cosmos DB 連接字串。

  • Azure Cosmos DB 是完全受控的無伺服器資料庫,可立即自動調整。 在目前的解決方案中,這兩個微服務都會使用 MongoDB Node.js 驅動程式,將數據儲存在 Azure Cosmos DB 中。 服務不會共享數據,而且您可以將每個服務部署到自己的獨立資料庫。

  • Application Insights 是 Azure 監視器的功能,會報告應用程式效能、使用量、可用性和行為,以偵測並協助診斷異常狀況。

    微服務架構中的失敗通常會分散在各種元件上,且無法藉由隔離查看服務來診斷。 跨元件相互關聯遙測的能力對於診斷這些問題至關重要。 Application Insights 遙測會集中記錄整個要求管線,以偵測效能異常。 遙測會共用一般作業標識碼,允許跨元件相互關聯。

    APIM 和 Azure Functions 運行時間內建支援 Application Insights 來產生和相互關聯各種不同的遙測,包括標準應用程式輸出。 函式應用程式會使用Application Insights Node.js SDK 手動追蹤相依性和其他自定義遙測。

    如需此解決方案中分散式遙測追蹤的詳細資訊,請參閱 分散式遙測

替代項目

案例詳細資料

本文說明病患記錄管理的整合式解決方案。 健康組織需要在雲端中以數位方式儲存大量高度敏感的病患醫療測試數據。 內部和第三方系統必須能夠透過應用程式開發介面 (API) 安全地讀取和寫入數據。 與數據的所有互動都必須記錄在稽核緩存器中。

潛在使用案例

  • 從指定的外部端點存取高度敏感數據。
  • 實作數據存取作業的安全稽核。
  • 整合相互依存的微服務應用程式與常見的存取和安全性。
  • 使用虛擬網路安全性功能,同時利用無伺服器成本節省和彈性。

福利

Azure Functions 等無伺服器應用程式的一些優點是僅使用必要計算資源的成本節省和彈性,而不是預先支付專用伺服器的費用。 此解決方案可讓 Azure Functions 針對安全性使用虛擬網路存取限制,而不會產生完整 Azure App 服務 環境 (ASE) 的成本和營運額外負荷。

APIM 會控制一組以 Azure Functions 為基礎的 API 微服務的內部和第三方存取。 病患 API 會為患者及其測試結果提供建立、讀取、更新和刪除 (CRUD) 作業。 Audit API 函式應用程式會提供作業來建立稽核專案。

每個函式應用程式都會將其資料儲存在獨立的 Azure Cosmos DB 資料庫中。 Azure 金鑰保存庫 安全地保存與應用程式和資料庫相關聯的所有密鑰、秘密和 連接字串。 Application Insights 遙測和 Azure 監視器會集中記錄整個系統。

考量

這些考量能實作 Azure Well-Architected Framework 的要素,其為一組指導原則,可以用來改善工作負載的品質。 如需詳細資訊,請參閱 Microsoft Azure Well-Architected Framework (部分機器翻譯)。

實作此解決方案時,請考慮下列層面。

安全性

安全性可提供保證,以避免刻意攻擊和濫用您寶貴的資料和系統。 如需詳細資訊,請參閱安全性要素的概觀

由於數據的敏感度,此解決方案中的安全性至關重要。 解決方案會使用數種機制來保護資料:

  • APIM 閘道管理
  • 虛擬網路存取限制
  • 服務存取金鑰和連接字串
  • 金鑰保存庫 中的金鑰和 連接字串 管理
  • 金鑰保存庫 金鑰輪替
  • 受控服務識別

您可以使用 Azure DDoS 保護,保護您的 Azure API 管理 實例免受分散式阻斷服務 (DDoS) 攻擊。 Azure DDoS 保護提供增強的 DDoS 風險降低功能,以防止大量和通訊協定 DDoS 攻擊。

如需此解決方案安全性模式的詳細資訊,請參閱 API 管理、Functions 應用程式和 Azure Cosmos DB 之間通訊的安全性模式。

API 閘道管理

系統只能透過單一受控APIM端點公開存取。 APIM 子網會將連入流量限制為指定的網關節點 IP 位址。

APIM 可讓您輕鬆地與不同的驗證機制整合。 目前的解決方案需要訂用帳戶密鑰,但您也可以使用 Microsoft Entra ID 來保護 APIM 端點,而不需要在 APIM 中管理訂用帳戶密鑰。

虛擬網路

為了避免公開 API 和函式,Azure 虛擬網絡 會將 API 和函式的網路存取限制為特定的 IP 位址或子網。 API 管理 和 Azure Functions 都支援虛擬網路中的存取限制和部署。

函式應用程式可以限制 IPv4、IPv6 和虛擬網路子網存取。 根據預設,函式應用程式允許所有存取,但一旦您新增一或多個位址或子網限制,應用程式就會拒絕所有其他網路流量。

在此解決方案中,函式應用程式只允許在自己的虛擬網路內進行互動。 病患 API 允許從 APIM 子網呼叫,方法是將 APIM 子網新增至其存取限制允許清單。 稽核 API 允許將病患 API 子網新增至其存取限制允許清單,來與病患 API 進行通訊。 API 會拒絕來自其他來源的流量。

解決方案會使用 區域虛擬網路整合 ,整合APIM和函式應用程式與相同的虛擬網路和 Azure 區域。 使用區域虛擬網路整合有幾個重要考慮:

  • 您必須使用 Azure Functions Premium SKU 來同時具有區域虛擬網路整合和延展性。
  • 您必須使用 APIM開發人員或進階SKU 來啟用 VNET 連線
  • 由於您將函式應用程式部署在虛擬網路的子網中,因此您可以設定函式應用程式的存取限制,以允許來自虛擬網路中其他子網的流量。
  • 區域虛擬網路整合只會限制從 Azure 函式到虛擬網路的輸出流量。 雖然受應用程式存取清單的限制,但輸入流量仍會路由傳送到虛擬網路外部。

只有 App Service 環境 提供完整的網路層級虛擬網路隔離。 ASE 需要比支援區域虛擬網路整合的 Azure Functions 更多的費用和精力來實作。 ASE 調整也較不彈性。

存取金鑰

您可以呼叫 APIM 和函式應用程式,而不需使用存取金鑰。 不過,停用存取密鑰不是很好的安全性做法,因此此解決方案中的所有元件都需要密鑰才能存取。

  • 存取 APIM 需要訂用帳戶金鑰,因此使用者必須包含在 Ocp-Apim-Subscription-Key HTTP 標頭中。
  • 病患 API 函式應用程式中的所有函式都需要 API 存取金鑰,因此在呼叫病患 API 時,APIM 必須包含在 x-functions-key HTTP 標頭中。
  • 在稽核 API 函式應用程式中呼叫CreateAuditRecord需要 API 存取金鑰,因此在呼叫CreateAuditRecord函式時,病患 API 必須包含在 x-functions-key HTTP 標頭中。
  • 這兩個 Functions 應用程式都會使用 Azure Cosmos DB 作為其資料存放區,因此必須使用 連接字串 來存取 Azure Cosmos DB 資料庫。

金鑰保存庫記憶體

雖然在應用程式設定中可以保留存取密鑰和 連接字串,但不是很好的做法,因為任何可以存取應用程式的人員都可以看到密鑰和字串。 最佳做法,特別是生產環境,是保留 Azure 金鑰保存庫 中的密鑰和字串,並使用 金鑰保存庫 參考來呼叫應用程式。 金鑰保存庫 只允許存取指定的受控識別。

APIM 會使用輸入原則來快取病患 API 主機密鑰,以改善效能。 針對後續嘗試,APIM 會先尋找其快取中的密鑰。

  • APIM 會從 金鑰保存庫 擷取病患 API 主機密鑰、快取它,並在呼叫病患 API 函式應用程式時將其放入 HTTP 標頭中。
  • 病患 API 函式應用程式會從 金鑰保存庫 擷取稽核 API 主機金鑰,並在呼叫 Audit API 函式應用程式時將其放入 HTTP 標頭中。
  • Azure Function 執行時間會在傳入要求上驗證 HTTP 標頭中的密鑰。

金鑰輪替

輪替 金鑰保存庫 金鑰有助於讓系統更安全。 您可以定期自動輪替密鑰,也可以手動或視需要輪替密鑰,以防外洩。

金鑰輪替牽涉到更新數個設定:

  • 函式應用程式主機金鑰本身
  • 金鑰保存庫 中儲存主機密鑰的秘密
  • 函式應用程式設定中的 金鑰保存庫 參考,以參考最新的秘密版本
  • 病患 API 的 APIM 快取原則中的 金鑰保存庫 參考

目前的解決方案會針對大部分的金鑰輪替工作使用 Terraform。 如需詳細資訊,請參閱 使用 Terraform 的金鑰輪替模式。

受控識別

在此解決方案中,APIM 和函式應用程式會使用 Azure 系統指派的受控服務識別 (MSIS) 來存取 金鑰保存庫 秘密。 金鑰保存庫 每個服務的受控識別都有下列個別存取原則:

  • APIM 可以取得病患 API 函式應用程式的主機金鑰。
  • 病患 API 函式應用程式可以取得稽核 API 主機密鑰,以及其資料存放區的 Azure Cosmos DB 連接字串。
  • 稽核 API 函式應用程式可以取得其資料存放區的 Azure Cosmos DB 連接字串。

成本最佳化

成本最佳化是關於考慮如何減少不必要的費用,並提升營運效率。 如需詳細資訊,請參閱成本最佳化要素的概觀

Azure Functions 等無伺服器應用程式的主要優點之一是只支付耗用量的費用,而不是預先支付專用伺服器的費用。 虛擬網路支援需要 Azure Functions Premium 方案,並收取額外費用。 Azure Functions Premium 支援區域虛擬網路整合,同時仍支援動態調整。 Azure Functions Premium SKU 包含 APIM 上的虛擬網路整合。

如需詳細數據和定價計算機,請參閱 Azure Functions 定價

函式也可以裝載在App Service虛擬機。 只有 App Service 環境 (ASE) 提供完整的網路層級虛擬網路隔離。 ASE 比支援區域虛擬網路整合的 Azure Functions 方案更昂貴,而 ASE 調整的彈性較低。

部署此案例

此解決方案的原始碼位於 Azure VNet 整合式無伺服器微服務

PatientTest API 和 Audit APITypeScript 原始碼位於 /src 資料夾中。 每個 API 的來源都包含 已安裝所有必要條件的開發容器 ,以協助您快速上手。

這兩個 API 都有一套完整的自動化整合和單元測試,可協助您在進行變更時防止回歸。 專案也會設定為使用 ESLint 進行 Linting 處理 ,以維護程式代碼樣式,並協助防範非預期的錯誤。 服務的個別自述檔包含如何執行測試和Linting的資訊。

Terraform 部署

程式代碼專案的 /env 資料夾包含 Terraform 部署的腳本和範本。 Terraform 會部署APIM和函式應用程式,並將其設定為使用已部署的Application Insights 實例。 Terraform 也會佈建所有資源和設定,包括網路鎖定和存取密鑰安全性模式。

部署 自述文件 說明如何在您自己的 Azure 訂用帳戶中部署 Terraform 環境。 資料夾 /env 也包含 開發容器 ,其已安裝 Terraform 部署的所有必要條件。

Locust 負載測試

若要量測 API 效能,您可以使用隨附 的 Locust 負載測試,對 API 執行負載測試Locust 是開放原始碼負載測試工具,並以 Python 撰寫測試。 您可以在本機或遠端在 Azure Kubernetes Service (AKS) 叢集中執行負載測試。 測試會針對APIM端點執行各種作業,並針對成功和失敗準則驗證行為。

參與者

本文由 Microsoft 維護。 原始投稿人如下。

主體作者:

若要查看非公開的 LinkedIn 設定檔,請登入 LinkedIn。

下一步

下列架構涵蓋主要 API 管理 案例:

下列文章涵蓋重要函式案例: