在应用程序网关处使用 TLS 终止向 Internet 公开应用程序

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。

本文介绍如何使用应用程序网关向 Internet 公开应用程序。

在虚拟网络 (VNET) 中部署 Azure Spring Apps 服务实例时,只能在专用网络中访问该服务实例上的应用程序。 若要使应用程序可在 Internet 上访问,需要与 Azure 应用程序网关集成。 传入的加密流量可以在应用程序网关处解密,也可以传递到加密的 Azure Spring Apps,以实现端到端 TLS/SSL。 出于开发和测试目的,可以从应用程序网关处的 SSL 终止开始,本指南对此进行了介绍。 对于生产环境,建议使用专用证书进行端到端 TLS/SSL,如在虚拟网络中使用端到端 TLS 公开应用程序中所述。

先决条件

为 Azure Spring Apps 配置应用程序网关

建议使浏览器显示的域名与应用程序网关用于将流量定向到 Azure Spring Apps 后端的主机名相同。 当使用应用程序网关公开在 Azure Spring Apps 中托管并驻留在虚拟网络中的应用程序时,此建议将提供最佳体验。 如果应用程序网关公开的域不同于 Azure Spring Apps 接受的域,则可能破坏 Cookie 和生成的重定向 URL(举例而言)。 有关详细信息,请参阅主机名保留

若要在专用 VNET 中配置 Azure Spring Apps 前面的应用程序网关,请使用以下步骤。

  1. 请按照在虚拟网络中部署 Azure Spring Apps 中的说明操作。
  2. 请按照在专用网络中访问应用程序中的说明操作。
  3. 获取所选域的证书,并将其存储在 Key Vault 中。 有关详细信息,请参阅教程:在 Azure Key Vault 中导入证书
  4. 在部署到 Azure Spring Apps 的应用上,从 Key Vault 配置自定义域和相应证书。 有关详细信息,请参阅教程:将现有的自定义域映射到 Azure Spring Apps
  5. 在根据以下列表配置的虚拟网络中部署应用程序网关:
    • 在后端池中使用 Azure Spring Apps,由后缀为 private.microservices.azure.cn 的域引用。
    • 使用 Key Vault 中的相同证书包含 HTTPS 侦听器。
    • 使用 HTTP 设置配置虚拟网络,该设置使用在 Azure Spring Apps 上配置的自定义域名,而不是后缀为 private.microservices.azure.cn 的域名。
  6. 将公共 DNS 配置为指向应用程序网关。

定义变量

接下来,按照在虚拟网络中部署 Azure Spring Apps 中的指示,使用以下命令为创建的资源组和虚拟网络定义变量。 根据实际环境将 <...> 占位符替换为实际值。 定义 SPRING_APP_PRIVATE_FQDN 时,请从 URI 中删除 https://

export SUBSCRIPTION='<subscription-id>'
export RESOURCE_GROUP='<resource-group-name>'
export LOCATION='chinanorth2'
export SPRING_CLOUD_NAME='<name-of-Azure-Spring-Apps-instance>'
export APPNAME='<name-of-app-in-Azure-Spring-Apps>'
export SPRING_APP_PRIVATE_FQDN='$APPNAME.private.microservices.azure.cn'
export VIRTUAL_NETWORK_NAME='azure-spring-apps-vnet'
export APPLICATION_GATEWAY_SUBNET_NAME='app-gw-subnet'
export APPLICATION_GATEWAY_SUBNET_CIDR='10.1.2.0/24'

登录 Azure

使用以下命令登录到 Azure CLI 并选择活动订阅。

az login
az account set --subscription $SUBSCRIPTION

在 Azure Spring Apps 上配置公共域名

流量将使用公共域名进入部署在 Azure Spring Apps 上的应用程序。 若要将应用程序配置为通过 HTTPS 侦听此主机名,请使用以下命令将自定义域添加到应用,将 <...> 占位符替换为实际值:

export KV_NAME='<name-of-key-vault>'
export KV_RG='<resource-group-name-of-key-vault>'
export CERT_NAME_IN_KV='<name-of-certificate-with-intermediaries-in-key-vault>'
export DOMAIN_NAME=myapp.mydomain.com

az spring app custom-domain bind \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --domain-name $DOMAIN_NAME \
    --app $APPNAME

创建网络资源

要创建的应用程序网关将加入与 Azure Spring Apps 服务实例相同的虚拟网络。 首先为虚拟网络中的应用程序网关创建新的子网,然后创建一个公共 IP 地址作为应用程序网关的前端,如以下示例所示。

export APPLICATION_GATEWAY_PUBLIC_IP_NAME='app-gw-public-ip'
az network vnet subnet create \
    --name $APPLICATION_GATEWAY_SUBNET_NAME \
    --resource-group $RESOURCE_GROUP \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --address-prefix $APPLICATION_GATEWAY_SUBNET_CIDR
az network public-ip create \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --name $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --allocation-method Static \
    --sku Standard

为应用程序网关创建托管标识

应用程序网关需要能够访问 Key Vault 来读取证书。 为此,应用程序网关将使用用户分配的托管标识。 有关详细信息,请参阅什么是 Azure 资源的托管标识?使用以下命令创建托管标识,替换 <...> 占位符:

export APPGW_IDENTITY_NAME='<name-for-appgw-managed-identity>'
az identity create \
    --resource-group $RESOURCE_GROUP \
    --name $APPGW_IDENTITY_NAME

然后,使用以下命令提取托管标识的 objectId。 稍后将使用此值提供访问 Key Vault 中证书的权限。

export APPGW_IDENTITY_CLIENTID=$(az identity show \
    --resource-group $RESOURCE_GROUP \
    --name $APPGW_IDENTITY_NAME \
    --query clientId \
    --output tsv)
export APPGW_IDENTITY_OID=$(az ad sp show \
    --id $APPGW_IDENTITY_CLIENTID \
    --query objectId \
    --output tsv)

在 Key Vault 上设置策略

使用以下命令配置 Key Vault,以便允许应用程序网关的托管标识访问存储在 Key Vault 中的证书:

az keyvault set-policy \
    --resource-group $KV_RG \
    --name $KV_NAME \
    --object-id $APPGW_IDENTITY_OID \
    --secret-permissions get list \
    --certificate-permissions get list

创建应用程序网关

使用 az network application-gateway create 创建应用程序网关,并指定应用程序的专用完全限定的域名 (FQDN) 作为后端池中的服务器。 请确保使用用户分配的托管标识,并使用证书的机密 ID 指向 Key Vault 中的证书。

export APPGW_NAME='<name-for-application-gateway>'
export CERT_NAME_IN_KV='<name-of-certificate-in-key-vault>'
export KEYVAULT_SECRET_ID_FOR_CERT=$(az keyvault certificate show \
    --name $CERT_NAME_IN_KV \
    --vault-name $KV_NAME \
    --query sid \
    --output tsv)

az network application-gateway create \
    --name $APPGW_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --capacity 2 \
    --sku Standard_v2 \
    --frontend-port 443 \
    --http-settings-cookie-based-affinity Disabled \
    --http-settings-port 80 \
    --http-settings-protocol Http \
    --public-ip-address $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --subnet $APPLICATION_GATEWAY_SUBNET_NAME \
    --servers $SPRING_APP_PRIVATE_FQDN \
    --key-vault-secret-id $KEYVAULT_SECRET_ID_FOR_CERT \
    --identity $APPGW_IDENTITY_NAME

Azure 可能需要长达 30 分钟的时间来创建应用程序网关。

更新 HTTP 设置以使用域名进入后端

更新 HTTP 设置以使用公共域名(而不是后缀为 .private.microservices.azure.cn 的域)作为主机名,从而将流量发送到 Azure Spring Apps。

az network application-gateway http-settings update \
    --resource-group $RESOURCE_GROUP \
    --gateway-name $APPGW_NAME \
    --host-name-from-backend-pool false \
    --host-name $DOMAIN_NAME \
    --name appGatewayBackendHttpSettings

检查应用程序网关的部署

创建后,请使用以下命令检查后端运行状况。 通过此命令的输出可确定应用程序网关是否通过其专用完全限定的域名 (FQDN) 到达应用程序。

az network application-gateway show-backend-health \
    --name $APPGW_NAME \
    --resource-group $RESOURCE_GROUP

输出指示后端池状态正常,如以下示例中所示:

{
  "backendAddressPools": [
    {
      "backendHttpSettingsCollection": [
        {
          "servers": [
            {
              "address": "my-azure-spring-apps-hello-vnet.private.microservices.azure.cn",
              "health": "Healthy",
              "healthProbeLog": "Success. Received 200 status code",
              "ipConfiguration": null
            }
          ]
        }
      ]
    }
  ]
}

配置 DNS 并访问应用程序

使用 CNAME 或 A 记录将公共 DNS 配置为指向应用程序网关。 可使用以下命令找到应用程序网关的公共地址:

az network public-ip show \
    --resource-group $RESOURCE_GROUP \
    --name $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --query [ipAddress] \
    --output tsv

你现可使用公共域名访问应用程序。

清理资源

如果打算继续阅读后续文章,则可能需要保留这些资源。 如果不再需要资源组,可以将其删除,这将删除资源组中的资源。 若要使用 Azure CLI 删除资源组,请使用以下命令:

az group delete --name $RESOURCE_GROUP

后续步骤