从公司与客户在内部和外部访问服务的方式上讲,API 已变得越来越重要。 在内部,API 用于访问业务线应用程序、内部构建解决方案和第三方集成。 在外部,越来越多的公司希望提高生产力并将其 API 变现。 考虑到这一趋势,API 管理已成为管理、治理和向内部与外部受众发布 API 的标准方法的核心组件。
现在,借助 Azure 应用程序网关,可以保护和限制通过 Azure API 管理提供的 API 的访问。 本文将介绍一种解决方案,可在其中通过单个 API 管理实例管理内部和外部 API。 你可以保持安全态势,避免直接通过 Internet 公开信息,而是通过应用程序网关来访问信息。
注意
此体系结构用作云采用框架中 Azure 登陆区域中 Azure API 管理指南的基础。
体系结构
此体系结构示意图从一个包罗万象的框开始,该框代表订阅范围、解析专用域的专用 DNS 区域,以及名为 APIM-CS VNet 的虚拟网络的范围。 订阅顶部的框指示它是一个本地工作负载。 该框中有一个服务器图标。 管道表示站点到站点连接,Azure ExpressRoute 连接到 Azure 订阅中的 API 管理实例。 显示 Azure 订阅的大框内还有其他七个小框。 其中四个框位于上部行,三个框位于下部行。 每个框代表一个单独的子网,其中附加了一个网络安全组。 从最左侧开始,有一个公共 IP 地址附加到上部行最左侧框中的 Azure 应用程序网关。 应用程序网关也在七个小框中的其中一个框中,包含名为“应用网关子网”的子网。 右侧的另一个框包含 API 管理实例,该实例包含名为“APIM 子网”的子网。 其旁边是上部行中的第三个框,其中包含名为“PE 子网”的子网中 Azure Functions 实例的专用终结点。 上部行中最右侧的框是包含 Azure 函数应用、函数的 Azure 应用服务计划以及与该函数应用关联的存储帐户的后端子网。 在下部行中,从左侧开始的第一个框包含 Bastion 子网中的 Azure Bastion。 第二个框包含 JumpBox 子网中的管理 Jumbox VM。 下部行中的最后一个框是 DevOps 子网中包含的 DevOps 代理。 插图右下方是三个共享资源及其各自的图标。 从左到右为以下框:密钥保管库、Application Insights 和 Log Analytics 工作区。 有两组工作流。 第一个工作流用黑色圆圈表示,另一个工作流用蓝色圆圈表示,后面的部分将予以说明。 黑色工作流表示可从外部访问 API。 流从访问公共 IP 地址的用户开始。 然后箭头指向应用程序网关的方向:从应用程序网关指向专用终结点,从专用终结点指向函数应用。 蓝色工作流从本地服务器开始,箭头通过表示站点到站点连接的管道图标或通过 ExpressRoute 指向 API 管理实例。 流的余下部分与上述相同:从 API 管理指向专用终结点,从专用终结点指向 Azure Function。
此体系结构假设已从 Azure 登陆区域加速器部署策略,并且该结构从管理组向下驱动。
下载此体系结构的 Visio 文件。
工作流
混合方案(蓝色圆圈)
此方案需要与本地环境建立站点到站点或 Azure ExpressRoute 连接。
- 某个本地应用程序需要访问通过 Azure API 管理处理的内部 API。
- API 管理连接到托管在 Azure Functions 上的后端 API。 此连接通过某个专用终结点,该终结点可通过 Azure Functions 高级计划使用,并托管在其自身的子网中。
- 该专用终结点安全访问托管在 Azure Functions 上的内部 API。
外部访问方案(黑色圆圈)
- 某个外部应用程序访问附加到 Azure 应用程序网关的公共 IP 地址或自定义 FQDN。
- 应用程序网关充当 Web 应用程序防火墙,该防火墙需要使用 PFX 证书来实现 SSL 终止。
- API 管理通过专用终结点连接到托管在 Azure Functions 上的后端 API。 此终结点可通过 Azure Functions 高级计划使用,并托管在其自身的子网中。
- 该专用终结点安全访问托管在 Azure Functions 上的外部可用 API。
组件
该体系结构使用以下组件:
Azure API 管理是一个托管服务,可用于跨混合环境和多云环境管理服务。 API 管理充当抽象化后端体系结构的门面,它为内部和外部用户提供 API 可观测性和使用控制与安全性。
Azure Functions 是一个无服务器解决方案,让你能够更专注于可执行的代码块并尽量减少基础结构管理工作。 Functions 可以托管在各种托管计划中,而由于使用了专用终结点,此参考体系结构使用的是高级计划。
Azure 应用程序网关是一个托管服务,充当第 7 层负载均衡器和 Web 应用程序防火墙。 在此方案中,应用程序网关保护内部 APIM 实例,你可以使用内部和外部模式。
Azure DNS 的专用 DNS 区域允许在虚拟网络中管理和解析域名,而无需实现自定义 DNS 解决方案。 通过虚拟网络链接,可将一个专用 DNS 区域链接到一个或多个虚拟网络。 由于 Azure Functions 通过此参考体系结构使用的专用终结点公开,因此必须使用专用 DNS 区域。
Azure Monitor 的 Application Insights 可帮助开发人员检测异常情况、诊断问题和了解使用模式。 Application Insights 为实时 Web 应用提供可扩展应用程序性能管理和监视。 支持各种平台,包括 .NET、Node.js、Java 和 Python。 它支持托管在 Azure、本地、混合环境或其他公有云中的应用。 Application Insights 已随附在此参考体系结构中,用于监视已部署的应用程序的行为。
Azure Monitor 的 Log Analytics 允许使用 Azure Monitor 日志中的数据编辑和运行日志查询,也可以选择性从 Azure 门户内部执行这种操作。 开发人员可以针对一组记录运行简单查询,或使用 Log Analytics 执行高级分析。 然后他们可将结果可视化。 Log Analytics 已配置为此参考体系结构的一部分,用于聚合所有监视日志以进行其他分析和报告。
Azure 虚拟机是一种计算资源,可用于托管许多不同的工作负载。 在此参考体系结构中,虚拟机用于提供管理 Jumpbox 服务器,以及提供 DevOps 代理或 GitHub 运行器的主机。
Azure 密钥保管库是一个云服务,可以安全存储和访问各种机密,包括 API 密钥和密码,以及证书和加密密钥。 此参考体系结构使用 Azure 密钥保管库来存储应用程序网关使用的 SSL 证书。
Azure Bastion 是在开发人员的虚拟网络中预配的平台即服务。 它从 Azure 门户通过 TLS 提供与开发人员虚拟机的安全 RDP/SSH 连接。 如果使用 Azure Bastion,虚拟机就不再需要使用公共 IP 地址来通过 RDP/SSH 进行连接。 此参考体系结构使用 Azure Bastion 来访问 DevOps 代理、GitHub 运行器服务器或管理 Jumpbox 服务器。
如果使用 DevOps 工具(例如 Azure DevOps 或 GitHub),则云托管的代理或运行器将通过公共 Internet 运行。 由于此体系结构中的 API 管理设置为内部网络,因此你需要使用能够访问 VNet 的 DevOps 代理。 DevOps 代理将帮助你为体系结构中的 API 部署策略和其他更改。 这些 可用于分解流程,并允许开发团队根据 API 部署更改。 它们由 DevOps 运行器执行。
备选方法
对于 API 管理实例连接到的后端服务,除了此参考实现中使用的 Azure Functions 以外,还可以使用多个备选方案:
- Azure 应用服务是一个完全托管的基于 HTTP 的服务,用于生成、部署和缩放 Web 应用。 .NET、.NET Core、Java、Ruby、Node.js、PHP 和 Python 均受支持。 应用程序可以在基于 Windows 或 Linux 的环境中运行和缩放。
- Azure Kubernetes 服务提供完全托管的 Kubernetes 群集,以实现集成的持续集成和持续交付 (CI/CD) 体验、治理和安全性。
- Azure 逻辑应用是一个基于云的平台,用于创建和运行自动化工作流。 可在 Azure 上的基本企业集成中找到示例参考体系结构。
- Azure 容器应用可用于在无服务器平台上运行微服务和容器化应用程序。
对于多区域部署,请考虑使用 Azure Front Door 在用户与应用程序的静态和动态 Web 内容之间提供快速、可靠且安全的访问。
若要查看有关应用程序网关如何保护 API 的更多示例,请参阅使用应用程序网关和 API 管理保护 API。
注意事项
这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改善工作负荷质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架。
可靠性
可靠性可确保应用程序符合你对客户的承诺。 有关详细信息,请参阅可靠性支柱概述。
- 在每个区域至少部署两个 API 管理缩放单元,它们分散在两个可用性区域。 此方法可以最大程度地提高可用性和性能。
- VNet 对等互连在一个区域中提供优异的性能,但它存在最多 500 个网络的可伸缩性限制。 如果需要连接更多工作负载,请使用中心辐射型设计或 Azure vWAN。
安全性
安全性针对蓄意攻击及滥用宝贵数据和系统提供保障措施。 有关详细信息,请参阅安全性支柱概述。
- API 管理验证策略可用于根据 OpenAPI 架构验证 API 请求和响应。 这些功能不能替代 Web 应用程序防火墙,但可以针对某些威胁提供额外保护。 添加验证策略可能会影响性能,因此我们建议使用性能负载测试来评估它们对 API 吞吐量的影响。
- 在 API 管理前面部署 Azure Web 应用程序防火墙 (WAF),以针对常见的 Web 应用程序攻击和漏洞提供保护。
- 对密钥保管库机密应用命名值,以保护 APIM 策略中的敏感信息。
- 对从外部访问内部 APIM 实例的行为使用应用程序网关,以保护 APIM 实例并启用混合连接。
- 在 VNet 中部署 API 管理网关,以支持混合连接并提高安全性。
- VNet 对等互连在一个区域中提供优异的性能,但它存在最多 500 个网络的可伸缩性限制。 如果需要连接更多工作负载,请使用中心辐射型设计或 Azure vWAN。
成本优化
成本优化是关于寻找减少不必要的费用和提高运营效率的方法。 有关详细信息,请参阅成本优化支柱概述。
- 由于需要可用性区域和虚拟网络支持,我们遵循每个区域的定价选择了 API 管理高级层。 此外,在此工作负载中,由于需要进行 VNet 访问,Azure Functions 托管在高级计划中。
- 对于概念证明或原型制作,我们建议使用其他 API 管理层(例如“开发人员”或“标准”)。
卓越运营
卓越运营涵盖了部署应用程序并使其在生产环境中保持运行的运营流程。 有关详细信息,请参阅卓越运营支柱概述。
- API 管理配置应以 ARM 模板的形式表示,并且应在其中采用基础结构即代码的思维模式。
- 使用 CI/CD 流程来管理、更新 API 管理配置和控制其版本。
- 创建自定义运行状况探测以帮助验证 API 管理实例的状态。 使用 URL
/status-0123456789abcdef
为应用网关中的 APIM 服务创建通用运行状况终结点。 - 在密钥保管库中更新的证书将在 API 管理中自动轮换,并在 4 小时内更新。
- 在每个区域至少部署两个 API 管理缩放单元,它们分散在两个可用性区域。 此方法可以最大程度地提高可用性和性能。
部署此方案
GitHub 上提供了此体系结构。 此体系结构包含所有必要的基础结构即代码文件和部署说明。
作者
本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。
主要作者:
- Pete Messina | 高级云解决方案架构师
- Anthony Nevico | 高级云解决方案架构师
若要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。
后续步骤
- 云采用框架指南Azure 登陆区域中的 Azure API 管理
- 用于使用 Azure 资源管理器模板进行 API 管理的 CI/CD
- API 管理简介
- 使用 APIM 管理 API
- API 管理入门资源
查看以下关键资源:
详细了解以下关键服务:
- Azure Functions 概述
- Azure 专用 DNS 区域
- Azure Application Insights 概述
- Azure Log Analytics 概述
- Azure 虚拟机概述
- Azure 密钥保管库概述
- Azure Bastion 概述