category
在此Azure解决方案中,Azure API管理(APIM)通过单个托管端点控制对API的访问。应用程序后端由两个相互依赖的Azure Functions微服务应用程序组成,它们创建和管理患者记录和审计记录。APIM和这两个功能应用程序通过锁定的虚拟网络相互访问。
本文和相关的代码项目将示例场景提炼为主要的技术组件,作为特定实现的脚手架。该解决方案使用Terraform自动化所有代码和基础设施部署,并包括自动化集成、单元和负载测试。
架构
下图显示了患者记录创建请求流程:
显示虚拟网络集成微服务的图表。
Download a Visio file of this architecture.
流
- 外部服务和客户向APIM发出POST请求,其中包含患者信息的数据体。
- APIM使用给定的患者信息调用患者API中的CreatePatient函数。
- Patient API中的CreatePatient函数调用Audit API函数应用程序中的CreateAuditRecord函数来创建审核记录。
- 审核API CreateAuditRecord函数在Azure Cosmos DB中创建审核记录,并向Patient API CreatePatient函数返回成功响应。
- CreatePatient函数在Azure Cosmos DB中创建患者文档,并向APIM返回成功响应。
- 外部服务和客户端接收来自APIM的成功响应。
组件
该解决方案使用以下组件:
- Azure API管理(APIM)是一个混合的多云平台,用于管理所有环境中的API。在该解决方案中,APIM控制对患者API的内部和第三方访问,允许读取和/或写入数据。APIM允许与不同的身份验证机制轻松集成。
- Azure Functions是一个无服务器计算平台,用于处理小的、事件驱动的代码片段。云基础设施提供了必要的更新服务器,以大规模运行功能。当前的解决方案使用一组两个Azure Functions API微服务,用于创建和管理患者测试结果和审计记录的操作。
- Azure虚拟网络通过限制对特定IP地址或子网的网络访问,提供了一个隔离且高度安全的应用程序环境。APIM和Azure功能都支持在虚拟网络中进行访问限制和部署。该解决方案使用区域虚拟网络集成,将两个功能应用程序部署在同一区域的同一虚拟网络中。
- Azure密钥库集中存储、加密和管理对密钥、证书和连接字符串的访问。此解决方案在只有指定身份才能访问的密钥保管库中维护Azure功能主机密钥和Azure Cosmos DB连接字符串。
- Azure Cosmos DB是一个完全管理的无服务器数据库,具有即时、自动扩展功能。在当前的解决方案中,两个微服务都使用MongoDB Node.js驱动程序将数据存储在Azure Cosmos DB中。这些服务不共享数据,您可以将每个服务部署到其自己的独立数据库中。
- Azure Monitor的一项功能Application Insights报告应用程序性能、使用情况、可用性和行为,以检测和帮助诊断异常。
- Application Insights。基于微服务的架构中的故障通常分布在各种组件上,不能通过孤立地查看服务来进行诊断。跨组件关联遥测的能力对于诊断这些问题至关重要。Application Insights遥测将日志记录集中在整个请求管道上,以检测性能异常。遥测共享一个通用操作ID,允许在组件之间进行关联。
APIM和Azure Functions运行时内置了对Application Insights的支持,以生成和关联各种遥测数据,包括标准应用程序输出。功能应用程序使用Application Insights Node.js SDK手动跟踪依赖项和其他自定义遥测。
有关此解决方案中分布式遥测跟踪的更多信息,请参阅分布式遥测。
选择
- 当前的解决方案需要订阅密钥才能访问APIM端点,但您也可以使用Microsoft Entra身份验证。
- 除了需要API访问密钥外,您还可以使用Azure Functions内置的应用程序服务身份验证来为API的托管身份启用Microsoft Entra授权。
- 您可以用另一个MongoDB服务替换此解决方案中的Azure Cosmos DB端点,而无需更改代码。
为了获得额外的Azure Cosmos DB安全性,您可以锁定从Azure Cosmos数据库到功能应用程序的流量。 - Azure Cosmos DB等组件可以向Azure Monitor发送遥测数据,在那里它可以与Application Insights的遥测数据相关联。
您可以使用Azure门户或Azure CLI执行密钥库密钥轮换任务,而不是Terraform。 - 您可以使用Azure DevOps或GitHub Actions等系统来自动化解决方案部署,而不是Terraform。
- 为了获得更高的可用性,此解决方案可以部署到多个区域。将Azure Cosmos DB设置为多主机,使用APIM内置的多区域支持,并将Azure Function应用程序部署到成对的区域。
场景详细信息
本文介绍了一种用于患者记录管理的集成解决方案。卫生组织需要将大量高度敏感的患者医疗检测数据数字化存储在云中。内部和第三方系统必须能够通过应用程序编程接口(API)安全地读取和写入数据。所有与数据的交互都必须记录在审计登记簿中。
潜在用例
- 从指定的外部端点访问高度敏感的数据。
- 对数据访问操作实施安全审核。
- 集成相互依赖的微服务应用程序,实现通用访问和安全。
- 使用虚拟网络安全功能,同时利用无服务器的成本节约和灵活性。
好处
- 像Azure Functions这样的无服务器应用程序的一些好处是只使用必要的计算资源,而不是预先为专用服务器付费,从而节省了成本并具有灵活性。此解决方案允许Azure功能使用虚拟网络访问限制进行安全保护,而不会产生完整Azure应用程序服务环境(ASE)的成本和操作开销。
- APIM控制对基于Azure功能构建的一组API微服务的内部和第三方访问。患者API为患者及其测试结果提供创建、读取、更新和删除(CRUD)操作。审核API功能应用程序提供创建审核条目的操作。
- 每个功能应用程序都将其数据存储在一个独立的Azure Cosmos DB数据库中。Azure密钥库安全地保存与应用程序和数据库相关联的所有密钥、机密和连接字符串。Application Insights遥测和Azure Monitor在整个系统中集中日志记录。
注意事项
这些注意事项实现了Azure架构良好的框架的支柱,这是一套可用于提高工作负载质量的指导原则。有关详细信息,请参阅Microsoft Azure架构良好的框架。
在实现此解决方案时,请考虑以下方面。
安全
安全性提供了防止蓄意攻击和滥用您的宝贵数据和系统的保证。有关更多信息,请参阅安全支柱概述。
由于数据的敏感性,安全性在该解决方案中至关重要。该解决方案使用多种机制来保护数据:
- APIM网关管理
- 虚拟网络访问限制
- 服务访问密钥和连接字符串
- 密钥库中的密钥和连接字符串管理(Key and connection string management in Key Vault)
- 钥匙库钥匙旋转 (Key Vault key rotation)
- 托管服务标识 (Managed service identities)
您可以使用Azure DDoS保护来保护Azure API管理实例免受分布式拒绝服务(DDoS)攻击。Azure DDoS防护提供了增强的DDoS缓解功能,以抵御体积和协议DDoS攻击。
有关此解决方案的安全模式的更多详细信息,请参阅API管理、函数应用程序和Azure Cosmos DB之间的通信安全模式。
API网关管理
该系统只能通过单个托管APIM端点公开访问。APIM子网将传入流量限制为指定的网关节点IP地址。
APIM允许与不同的身份验证机制轻松集成。当前的解决方案需要订阅密钥,但您也可以使用Microsoft Entra ID来保护APIM端点,而无需在APIM中管理订阅密钥。
虚拟网络
为了避免公开API和函数,Azure虚拟网络将API和函数的网络访问限制为特定的IP地址或子网。API管理和Azure功能都支持虚拟网络中的访问限制和部署。
功能应用程序可以限制IPv4、IPv6和虚拟网络子网访问。默认情况下,功能应用程序允许所有访问,但一旦添加一个或多个地址或子网限制,该应用程序就会拒绝所有其他网络流量。
在此解决方案中,功能应用程序仅允许在其自己的虚拟网络中进行交互。患者API通过将APIM子网添加到其访问限制允许列表中,允许从APIM子网上进行调用。通过将患者API子网添加到其访问限制允许列表中,审核API允许与患者API通信。API拒绝来自其他来源的流量。
该解决方案使用区域虚拟网络集成来集成APIM和具有相同虚拟网络和Azure区域的功能应用程序。使用区域虚拟网络集成有几个重要考虑因素:
- 您需要使用Azure功能高级SKU来实现区域虚拟网络集成和可扩展性。
- 您需要使用APIM Developer或Premium SKU来启用VNET连接
- 由于您在虚拟网络的子网中部署了功能应用程序,因此您可以配置功能应用程序的访问限制,以允许来自虚拟网络中其他子网的流量。
- 区域虚拟网络集成仅限制从Azure功能到虚拟网络的出站流量。入站流量仍在虚拟网络之外路由,尽管受到应用程序访问列表的限制。
- 只有应用程序服务环境提供完整的网络级虚拟网络隔离。与支持区域虚拟网络集成的Azure功能相比,ASE可能需要更多的费用和精力来实现。ASE缩放的弹性也较小。
访问密钥
您可以在不使用访问密钥的情况下调用APIM和函数应用程序。但是,禁用访问密钥并不是一种好的安全做法,因此此解决方案中的所有组件都需要密钥进行访问。
- 访问APIM需要订阅密钥,因此用户需要在HTTP标头中包含Ocp-APIM订阅密钥。
- 患者API功能应用程序中的所有功能都需要API访问密钥,因此当调用患者API时,APIM必须在HTTP头中包含x-functions-key。
- 在Audit API函数应用程序中调用CreateAuditRecord需要API访问密钥,因此患者API在调用CreateAudidRecord函数时需要在HTTP头中包含x-functions-key。
- 这两个函数应用程序都使用Azure Cosmos DB作为其数据存储,因此它们必须使用连接字符串来访问Azure Cosmos数据库。
密钥保管库存储
尽管可以在应用程序设置中保留访问密钥和连接字符串,但这不是一个好的做法,因为任何可以访问应用程序的人都可以看到这些密钥和字符串。最佳做法,尤其是对于生产环境,是将密钥和字符串保存在Azure密钥库中,并使用密钥库引用来调用应用程序。密钥保管库只允许访问指定的托管身份。
- APIM使用入站策略缓存患者API主机密钥以提高性能。对于随后的尝试,APIM首先在其缓存中查找密钥。
- 当调用Patient API功能应用程序时,APIM从密钥库中检索Patient API主机密钥,将其缓存,并将其放入HTTP头中。
- 患者API功能应用程序从密钥库中检索Audit API主机密钥,并在调用Audit API功能应用程序时将其放入HTTP头中。
Azure Function运行时验证传入请求的HTTP标头中的密钥。
密钥旋转
旋转密钥保管库密钥有助于使系统更加安全。您可以定期自动旋转关键点,也可以手动旋转关键点或根据需要旋转关键点以防泄漏。
关键点旋转涉及更新几个设置:
- 功能应用程序主机密钥本身
- 存储主机密钥的密钥库中的秘密
- 功能应用程序应用程序设置中的密钥库参考,以参考最新的机密版本
- 患者API的APIM缓存策略中的密钥库参考
目前的解决方案将Terraform用于大多数关键的轮换任务。有关详细信息,请参见Terraform的关键点旋转模式。
托管身份
在此解决方案中,APIM和功能应用程序使用Azure系统分配的托管服务标识(MSIs)来访问密钥库机密。密钥保管库对每个服务的托管身份都有以下单独的访问策略:
APIM可以获取患者API功能应用程序的主机密钥。
患者API功能应用程序可以获取其数据存储的Audit API主机密钥和Azure Cosmos DB连接字符串。
Audit API函数应用程序可以获取其数据存储的Azure Cosmos DB连接字符串。
成本优化
成本优化是指寻找减少不必要费用和提高运营效率的方法。有关更多信息,请参阅成本优化支柱概述。
像Azure Functions这样的无服务器应用程序的主要好处之一是只为消费付费,而不是提前为专用服务器付费,从而节省了成本。虚拟网络支持需要额外收费的Azure功能高级计划。Azure功能高级支持区域虚拟网络集成,同时仍支持动态扩展。Azure功能高级SKU包括APIM上的虚拟网络集成。
有关详细信息和定价计算器,请参阅Azure功能定价。
功能也可以托管在App Service虚拟机上。只有应用程序服务环境(ASE)提供完整的网络级虚拟网络隔离。ASE可能比支持区域虚拟网络集成的Azure功能计划贵得多,并且ASE扩展的弹性较小。
部署此场景
此解决方案的源代码位于Azure VNet集成无服务器微服务。
PatientTest API和Audit API的TypeScript源代码位于/src文件夹中。每个API的源代码都包含一个安装了所有先决条件的开发容器,以帮助您快速启动。
这两个API都有一套完整的自动化集成和单元测试,以帮助您在进行更改时防止倒退。该项目还配置为使用ESLint进行linting,以维护代码样式并帮助防止意外错误。服务各自的README文件包含有关如何运行测试和linting的信息。
Terraform部署
代码项目的/env文件夹包括Terraform部署的脚本和模板。Terraform部署APIM和功能应用程序,并将它们配置为使用部署的Application Insights实例。Terraform还提供所有资源和配置,包括网络锁定和访问密钥安全模式。
部署自述解释了如何在您自己的Azure订阅中部署Terraform环境。/env文件夹还包括一个dev容器,该容器安装了Terraform部署的所有先决条件。
Locust load testing
为了衡量API的性能,您可以针对包含Locust负载测试的API运行负载测试。Locust是一个开源的负载测试工具,测试是用Python编写的。您可以在本地或Azure Kubernetes服务(AKS)集群中远程运行负载测试。测试针对APIM端点执行各种操作,并根据成功和失败标准验证行为。
Next steps
- Use Azure API Management with microservices deployed in Azure Kubernetes Service
- How to use Azure API Management with virtual networks
- How to use managed identities for App Service and Azure Functions
- Use Key Vault references for App Service and Azure Functions
- APIs and microservices e-book
- API Management access restriction policies
- Azure Functions networking options
- Azure Functions scale and hosting
Related resources
The following architectures cover key API Management scenarios:
- Migrate a web app using Azure API Management
- Protect APIs with Application Gateway and API Management
- Azure API Management landing zone accelerator
The following articles cover key functions scenarios:
- Integrate Event Hubs with serverless functions on Azure
- Monitor Azure Functions and Event Hubs
- Azure Functions in a hybrid environment
- Performance and scale for Event Hubs and Azure Functions
- Code walkthrough: Serverless application with Functions
- Azure App Service and Azure Functions considerations for multitenancy
- 登录 发表评论
- 6 次浏览
最新内容
- 1 day 6 hours ago
- 1 day 8 hours ago
- 1 day 9 hours ago
- 4 days ago
- 4 days 8 hours ago
- 4 days 8 hours ago
- 4 days 9 hours ago
- 4 days 9 hours ago
- 1 week 1 day ago
- 1 week 1 day ago