你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用应用服务环境的企业部署

Microsoft Entra ID
Azure 应用程序网关
Azure 应用程序服务
Azure 防火墙
Azure 虚拟网络
Azure 专用链接

此参考体系结构演示了使用应用服务环境版本 3 的常见企业工作负载。 它还介绍了增强工作负载安全性的最佳做法。

注释

本体系结构的主要组件是应用服务环境版本 3。 版本 1 和 2 于 2024 年 8 月 31 日停用

Architecture

此图显示了应用服务环境部署的体系结构。

下载此体系结构的 Visio 文件

GitHub logo GitHub 中提供了本体系结构的参考实现。

Workflow

可以通过两种方式部署应用服务环境:

  • 作为具有公共 IP 地址 的外部 应用服务环境

  • 作为 内部应用服务 环境,其内部 IP 地址属于内部负载均衡器 (ILB)

此参考体系结构在内部应用服务环境中部署企业 Web 应用程序,也称为 ILB 应用服务环境。 在需要以下功能的方案中使用 ILB 应用服务环境:

  • 在云中具有增强安全性的主机 Intranet 应用程序,并通过站点到站点 VPN 或 Azure ExpressRoute 访问它们。

  • 使用 Web 应用程序防火墙 (WAF) 为应用提供保护层。

  • 在云中托管未在公共域名系统(DNS)服务器中列出的应用。

  • 创建前端应用可以通过高度安全的方式与 Internet 隔离的后端应用集成。

始终在企业虚拟网络中的自己的子网中部署应用服务环境。 此方法保持对传入和传出流量的严格控制。 在此子网中,Azure 应用服务应用程序在一个或多个 应用服务计划中运行,这些计划是运行应用所需的物理资源集合。 根据复杂性和资源要求,多个应用可以共享应用服务计划。 应用服务环境基础结构管理这些托管应用所需的所有资源,包括存储、计算和缩放。

本参考实现会部署一个名为 Voting App 的 Web 应用,该应用可与专用 Web API 和函数交互。 它还部署名为 Test App 的模拟 Web 应用来演示多应用部署。 在参考实现中,每个应用服务应用在其自己的应用服务计划中运行,从而在需要时启用独立缩放。

通过此实现中的简单投票应用,用户可以查看现有条目、创建新条目,并对现有条目进行投票。 Web API 创建和检索条目和投票。 数据存储在 Azure SQL 数据库中。 为了演示异步数据更新,Web 应用在 Azure 服务总线实例中对新添加的投票进行排队。 函数拾取排队的投票并更新 SQL 数据库。 Azure Cosmos DB 存储 Web 应用检索到在浏览器中显示的模拟广告。 应用程序使用 Azure Cache for Redis 进行缓存管理。 高级层 Azure Redis 缓存在与应用服务环境相同的虚拟网络中配置,并在自己的子网中运行。 此设置为缓存提供增强的安全性和隔离。

Web 应用是唯一可从 Internet 访问的组件。 Internet 流量必须通过受 WAF 保护的 Azure 应用程序网关进行保护。 Internet 客户端无法访问 API 或函数应用。

Components

以下服务有助于保护此体系结构中的应用服务环境:

  • Azure 虚拟网络 提供企业拥有的私有云 Azure 云网络。 它提供基于网络的增强的安全性和隔离。 此体系结构将应用服务环境部署到企业拥有的虚拟网络的子网中。 应用服务环境允许企业使用网络安全组(NSG)和专用终结点严格控制网络空间及其访问的资源。

  • 应用程序网关 是具有传输层安全性(TLS)或安全套接字层(SSL)卸载和 WAF 的应用程序级 Web 流量负载均衡器。 在此体系结构中,应用程序网关接受公共 IP 地址上的传入流量,并将其路由到 ILB 应用服务环境中的应用程序终结点。 此应用程序级路由可以将流量路由到同一 ILB 应用服务环境中的多个应用。 有关详细信息,请参阅 应用程序网关多站点托管

  • Azure 防火墙 是 Azure 中内置的云原生有状态防火墙服务。 它提供高可用性和不受限制的云可伸缩性,并支持入站和出站筛选规则。 在此体系结构中,Azure 防火墙限制来自 Web 应用程序的出站流量。 路由表配置为将不通过专用终结点通道的传出流量路由到防火墙。 为简单起见,此体系结构在服务子网上配置所有专用终结点。

  • Microsoft Entra ID 提供对 Azure 资源和服务的访问权限和权限管理。 托管标识 将标识分配给服务和应用。 他们可以向支持Microsoft Entra 身份验证的任何服务进行身份验证。 此方法无需显式配置这些应用的凭据。 此体系结构将托管标识分配给 Web 应用。

  • Azure Key Vault 是一种云服务,可安全地存储和管理敏感信息,例如机密、加密密钥和证书。 此体系结构使用 Key Vault 来存储应用所需的机密和凭据。 使用此选项,而不是直接将机密存储在应用程序中。

  • GitHub Actions 是内置于 GitHub 中的工作流自动化功能,用于启用 CI/CD。 在此体系结构中,应用服务环境位于虚拟网络中,因此 VM 充当虚拟网络中的跳转盒,以便在应用服务计划中部署应用。 该操作在虚拟网络外部生成应用。 若要增强安全性和无缝远程桌面协议(RDP)和安全外壳(SSH)连接,请考虑将 Azure Bastion 用于 jumpbox。

多站点配置

显示多站点部署的关系图。

内部应用服务环境可以托管多个具有 HTTP 终结点的 Web 应用和 API。 这些应用程序不会公开到公共 Internet,因为只能从虚拟网络内部访问 ILB IP 地址。 应用程序网关 选择性地将这些应用程序公开到 Internet。 应用服务环境将默认 URL 分配给每个应用服务应用程序。<default-appName>.<app-service-environment-domain>.appserviceenvironment.net 创建一个专用 DNS 区域,用于将应用服务环境域名映射到应用服务环境 ILB IP 地址。 此方法可避免在虚拟网络中自定义 DNS 进行应用访问。

应用程序网关配置为包含接受网关 IP 地址上的 HTTP 请求的 侦听器 。 为简单起见,此实现不使用公共 DNS 名称注册。 必须修改计算机上的 localhost 文件,以将任意选择的 URL 指向应用程序网关 IP 地址。 侦听器使用自签名证书来处理这些请求。 应用程序网关为每个应用服务应用程序的默认 URL 提供 后端池路由规则配置为将侦听器连接到后端池。 HTTP 设置 确定网关与应用服务环境之间的连接是否使用加密。 这些设置还会使用后端池中的主机名替代传入的 HTTP 主机标头。 此实现使用为默认应用服务环境应用 URL 创建的默认证书,并且网关信任这些证书。 请求将重定向到相应应用的默认 URL。 链接到虚拟网络的专用 DNS 将此请求转发到 ILB IP 地址。 然后,应用服务环境将请求转发到请求的应用服务。 应用服务环境应用中的任何 HTTP 通信都通过专用 DNS。 必须在每个应用服务环境应用的应用程序网关上配置侦听器、后端池、路由规则和 HTTP 设置。

查看 appgw.bicepdns.bicep 文件,了解这些配置如何允许多个站点。 名为 testapp 的 Web 应用是为演示此配置而创建的空应用。 commands_std.azcli 部署脚本访问 JSON 文件。 commands_ha.azcli 脚本对高可用性多站点应用服务环境部署使用相同的文件。

方案详细信息

应用服务 是一种平台即服务(PaaS)解决方案,用于在 Azure 上托管各种应用,包括 Web 应用、API 应用、函数和移动应用。 可以使用 应用服务环境 在自己的 Azure 虚拟网络的子网中部署应用服务应用。 此方法为云工作负载提供独立、高度可缩放和专用的环境。

注意事项

这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改进工作负荷质量的指导原则。 有关详细信息,请参阅 Well-Architected Framework

安全性

安全性提供针对故意攻击和滥用宝贵数据和系统的保证。 有关详细信息,请参阅可靠性设计审查检查表

应用服务环境

内部应用服务环境驻留在企业虚拟网络中,并隐藏在公共 Internet 中。 它使你能够在网络级别保护后端服务,例如 Web API 和函数。 可以通过虚拟网络中的 ILB 访问具有 HTTP 终结点的任何应用服务环境应用。 应用程序网关通过 ILB 将请求转发到 Web 应用。 Web 应用本身通过 ILB 访问 API。 无法从公共 Internet 访问关键后端组件(如 API 和函数)。

应用服务环境为每个应用服务分配默认域名,并为每个域名自动创建默认证书。 此证书有助于保护网关和应用之间的流量,在某些情况下可能需要此证书。 默认证书不会显示在客户端浏览器中,仅响应应用程序网关上配置的证书。

应用程序网关

应用程序网关可以使用 TLS 或 SSL 加密和保护 来自 Web 浏览器的所有流量。 可以通过两种方式配置加密:

  • 加密在网关处终止: 对于此方法,后端池配置为 HTTP。 加密在网关处停止,网关与应用服务之间的流量未加密。 加密是 CPU 密集型加密,因此后端的未加密流量可以提高性能,并允许更简单的证书管理。 此方法提供适度的安全性,因为网络配置可保护后端。

  • 端到端加密: 在某些具有特定安全或符合性要求的方案中,可能需要在网关和应用之间加密流量。 此配置使用 HTTPS 连接,需要在后端池中使用证书。

此参考实现针对应用程序网关使用自签名证书。 对于生产代码,请使用证书颁发机构颁发的证书(CA)。

以下示例通过 appgw.bicep 编程方式配置 HTTP 侦听器。

httpListeners: [for item in appgwApplications: {
name: '${appgwListenerName}${item.name}'
properties: {
  frontendIPConfiguration: {
    id: '${appgwId}/frontendIPConfigurations/${appgwFrontendName}'
  }
  frontendPort: {
    id: '${appgwId}/frontendPorts/port_443'
  }
  protocol: 'Https'
  sslCertificate: {
    id: '${appgwId}/sslCertificates/${appgwSslCertificateName}${item.name}'
  }
  hostName: item.hostName
  requireServerNameIndication: true
}
}]

参考实现演示了应用程序网关与应用服务环境中的 Web 应用之间的流量的端到端加密。 它使用默认 SSL 证书。 此实现中的后端池配置为重定向 HTTPS 流量。 它们还会使用与 Web 应用关联的默认域名替代主机名。 应用程序网关信任默认 SSL 证书,因为Microsoft颁发证书。 有关详细信息,请参阅 使用应用程序网关配置应用服务。 以下示例 appgw.bicep 展示了引用实现如何配置此方法。

backendHttpSettingsCollection: [for item in appgwApplications: {
name: '${appgwHttpSettingsName}${item.name}'
properties: {
  port: 443
  protocol: 'Https'
  cookieBasedAffinity: 'Disabled'
  pickHostNameFromBackendAddress: true
  requestTimeout: 20
  probe: {
    id: '${appgwId}/probes/${appgwHealthProbeName}${item.name}'
  }
}
}]
Web 应用程序防火墙

应用程序网关上的 Web 应用程序防火墙 可保护 Web 应用免受恶意攻击,例如 SQL 注入。 它还与 Azure Monitor 集成,以使用实时日志监视攻击。 若要启用 Web 应用程序防火墙,必须将 网关配置为满足其要求。 引用实现使用以下代码以编程方式在 appgw.bicep 文件中启用 WAF。

webApplicationFirewallConfiguration: {
  enabled: true
  firewallMode: 'Detection'
  ruleSetType: 'OWASP'
  ruleSetVersion: '3.2'
}

虚拟网络

可以将 NSG 与虚拟网络中的一个或多个子网相关联。 这些组定义允许或拒绝流量在各种 Azure 资源之间流动的安全规则。 此体系结构为每个子网关联单独的 NSG,该子网基于该子网中的服务启用微调规则。

  • 应用服务环境子网 NSG 的配置位于 文件 ase.bicep 中。

  • 应用程序网关子网的 NSG 配置位于文件 appgw.bicep 中。

这两种配置都使用资源 "type": "Microsoft.Network/networkSecurityGroups"

专用终结点可通过专用网络在客户端与 Azure 服务之间实现增强了安全性的专用连接。 它们为 Azure 服务提供一个专用访问的 IP 地址,该地址可实现 Azure 专用链接资源的增强安全性流量。 平台验证网络连接,仅允许面向指定专用链接资源的连接。

专用终结点支持网络策略,例如 NSG、用户定义的路由和应用程序安全组。 若要提高安全性,请为支持它们的任何 Azure 服务启用专用终结点。 为了帮助保护虚拟网络中的服务,请禁用公共访问以阻止来自公共 Internet 的访问。 此体系结构为支持它的服务配置专用终结点,包括 Azure 服务总线、SQL 数据库、Key Vault 和 Azure Cosmos DB。 可以在 privatendpoints.bicep 中查看该配置。

要启用专用终结点,还需要配置专用 DNS 区域。 有关详细信息,请参阅 Azure 专用终结点 DNS 配置

Azure 防火墙

Azure 防火墙和专用终结点两者相辅相成。 专用终结点通过仅允许源自虚拟网络的流量来帮助保护资源。 Azure 防火墙支持限制来自应用程序的出站流量。 建议允许所有出站流量通过防火墙子网,包括专用终结点流量。 此方法可更好地监视出站流量。 为简单起见,此参考体系结构在服务子网而不是防火墙子网上配置所有专用终结点。

有关详细信息,请参阅 使用应用服务环境配置 Azure 防火墙。 防火墙监视和控制不会遍历专用终结点和虚拟网络路由表的流量。

Microsoft Entra ID

Microsoft Entra ID 提供了安全功能用于对应用程序进行身份验证和授权访问资源。 此参考体系结构使用Microsoft Entra ID、托管标识和 Azure 基于角色的访问控制(RBAC)的两个主要功能。

在云应用程序中,必须保护向云服务进行身份验证所需的凭据。 理想情况下,凭据不应出现在开发人员工作站或源代码管理中。 Key Vault 安全地存储凭据和机密,但应用仍需向 Key Vault 进行身份验证才能检索凭据和机密。 Azure 资源的托管标识 为 Azure 服务提供了Microsoft Entra ID 中的自动托管标识。 可以使用此标识向任何支持Microsoft Entra 身份验证的服务(包括 Key Vault)进行身份验证,而无需应用程序中的任何凭据。

Azure RBAC 通过定义以下条件来管理对 Azure 资源的访问:

  • 哪些实体具有访问权限,例如用户、托管标识或安全主体

  • 其访问权限类型,例如所有者、参与者、读者或管理员

  • 访问范围,例如资源、资源组、订阅或管理组

通过严格控制每个应用所需的角色和访问类型,有助于保护对应用服务环境应用程序的访问。 此方法允许多个应用从不同的开发团队在同一应用服务环境中部署。 例如,一个团队可以处理前端,一个团队可以处理后端。 Azure RBAC 可以限制每个团队对他们工作的应用的访问权限。 若要创建适合组织的角色,请参阅 Azure 自定义角色

Key Vault

某些服务支持托管标识,并使用 Azure RBAC 为应用设置权限。 例如,请参阅 Azure Cosmos DB 中的内置服务总线角色和 Azure RBAC。 必须具有对订阅的 用户访问管理员 访问权限才能授予这些权限。 参与者角色可以部署这些服务。 若要允许更广泛的开发人员团队运行部署脚本,可以使用每个服务提供的本机访问控制。

如果工作负荷需要基于服务的访问,则应将这些预共享机密存储在 Key Vault 中。 通过 Web 应用程序的托管标识访问保管库。

应用访问 Key Vault 中存储的机密。 它们引用 Key Vault 密钥和值对。 此配置在 sites.bicep 文件中定义。 投票应用使用以下代码。

properties: {
  enabled: true
  hostingEnvironmentProfile: {
    id: aseId
  }
  serverFarmId: votingWebPlanName.id
  siteConfig: {
    appSettings: [
      {
        name: 'ASecret'
        value: '@Microsoft.KeyVault(SecretUri=${applicationKeyVault::secretName.secretUriWithVersion})'
      }
    ]
  }
}

成本优化

成本优化侧重于减少不必要的开支和提高运营效率的方法。 有关详细信息,请参阅成本优化设计评审核对清单

使用 Azure 定价计算器 估算成本。 有关详细信息,请参阅 Well-Architected Framework 中的成本优化支柱。 为了节省资金, Azure 预留 为许多 Azure 资源提供一年或三年计划。

请考虑此体系结构中某些关键服务的以下成本因素。

应用服务环境 v3

应用服务具有各种 定价选项。 应用服务环境通过独立 v2 服务计划部署。 此计划包括从 I1v2 到 I6v2 的多个 CPU 大小选项。 此参考实现使用三个 I1v2 实例。

应用程序网关

应用程序网关具有各种 定价选项。 此实现使用支持自动缩放和区域冗余的应用程序网关标准 v2 和 Web 应用程序防火墙 v2 SKU。 有关详细信息,请参阅 缩放应用程序网关 v2 和 Web 应用程序防火墙 v2

Azure Cache for Redis

Azure Redis 缓存具有各种 定价选项。 此体系结构使用高级 SKU 来支持虚拟网络。

其他依赖项

有助于保护应用服务环境的其他服务还具有多个定价选项:

卓越运营

卓越运营涵盖了部署应用程序并使其在生产环境中保持运行的运营流程。 有关详细信息,请参阅设计卓越运营的审查清单

此参考体系结构中的部署脚本部署应用服务环境、其他服务和应用服务环境中的应用程序。 部署这些应用程序后,企业可能会计划 CI/CD 进行应用维护和升级。 本部分介绍开发人员用于应用服务环境应用程序的 CI/CD 的常见方法。

只能从虚拟网络内部将应用部署到内部应用服务环境。 使用以下方法之一部署应用服务环境应用:

  • 使用虚拟网络中的 VM。 使用部署所需的工具在应用服务环境虚拟网络中创建 VM。 若要打开与 VM 的 RDP 连接,请使用 NSG 配置。 将代码项目复制到该 VM,然后生成并部署到应用服务环境子网。 此方法适用于设置初始生成和测试开发环境。 不要对生产环境使用此方法,因为它无法缩放以匹配所需的部署吞吐量。

  • 从本地工作站使用点到站点 VPN 连接。 将应用服务环境虚拟网络扩展到开发计算机。 从本地工作站部署。 此方法也适用于初始开发环境,但不适合生产环境。

  • 使用 Azure Pipelines。 实现完整的 CI/CD 管道,该管道以位于虚拟网络内的代理结尾。 此方法适用于需要高部署吞吐量的生产环境。 生成管道完全位于虚拟网络外部。 部署管道将生成的对象复制到虚拟网络中的生成代理,然后部署到应用服务环境子网。 有关详细信息,请参阅 Azure Pipelines 与应用服务环境虚拟网络之间的自承载生成代理

建议对生产环境使用 Azure Pipelines 或其他 CI/CD 工具。 若要自动执行生成和部署过程,请使用 Azure Pipelines YAML 架构编写 CI/CD 脚本。 azure-pipelines.yml文件在此参考实现中为 Web 应用实现此类 CI/CD 管道。 类似的 CI/CD 脚本支持 Web API函数。 有关这些工具如何帮助自动执行每个应用程序的 CI/CD 的详细信息,请参阅 “使用 Azure Pipelines”。

某些企业可能不希望在虚拟网络中维护永久生成代理。 在这种情况下,请考虑以下选项之一:

  • 动态创建生成代理: 在 DevOps 管道中创建生成代理,并在部署完成后将其拆除。 此方法为 DevOps 添加了另一个步骤,但简化了 VM 维护。

  • 器皿: 将容器用作生成代理,而不是 VM。

  • 在没有代理的情况下部署: 通过从虚拟网络外部的压缩文件(通常位于存储帐户中)进行部署来完全避免生成代理。 应用服务环境和管道必须有权访问存储帐户。 发布管道的末尾可以将压缩文件拖放到 Blob 存储中。 然后,应用服务环境可以选择它并进行部署。

    此方法包括以下限制:

    • 此方法使 DevOps 与实际部署过程断开连接,这使得监视和跟踪部署问题变得困难。
    • 在具有安全流量的锁定环境中,可能需要更新存储中压缩文件的访问规则。
    • 必须在应用服务环境中安装特定的扩展和工具才能从 ZIP 文件进行部署。

    有关应用部署方法的详细信息,请参阅 在应用服务中运行应用

性能效率

性能效率是指工作负荷能够高效地缩放以满足用户需求。 有关详细信息,请参阅性能效率设计评审核对清单

设计可缩放的应用

此参考体系结构结构应用程序,以便可以根据使用情况缩放各个组件。 每个 Web 应用、API 和函数部署在其自己的应用服务计划中。 可以监视每个应用的性能瓶颈,然后在需要时 纵向扩展

自动缩放应用程序网关

应用程序网关支持自动缩放。 此功能使应用程序网关能够根据流量负载模式纵向扩展或缩减。 此参考体系结构在 appgw.bicep 文件中配置autoscaleConfiguration,以在零到 10 个额外实例之间缩放。 有关详细信息,请参阅 缩放应用程序网关和 Web 应用程序防火墙

部署此方案

若要部署此体系结构的参考实现,请参阅 GitHub 自述文件,并按照脚本进行标准部署。

供稿人

Microsoft维护本文。 以下参与者撰写了本文。

主要作者:

其他参与者:

若要查看非公开的LinkedIn个人资料,请登录LinkedIn。

后续步骤