在虚拟网络中使用端到端 TLS 公开应用程序

注意

Azure Spring Apps 是 Azure Spring Cloud 服务的新名称。 虽然该服务具有新名称,但你将暂时在一些地方看到旧名称,我们正在更新屏幕截图、视频和图表等资产。

本文介绍如何使用应用程序网关向 Internet 公开应用程序。 在虚拟网络中部署 Azure Spring Apps 服务实例时,只能在专用网络中访问该服务实例上的应用程序。 若要使应用程序可在 Internet 上访问,需要与 Azure 应用程序网关集成。

先决条件

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

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

若要在 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='my-resource-group'
export LOCATION='chinanorth2'
export SPRING_CLOUD_NAME='name-of-spring-cloud-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 cloud set -n AzureChinaCloud
az login
az account set --subscription $SUBSCRIPTION

获取证书

对于生产部署,你极有可能使用公开签名的证书。 在这种情况下,请在 Azure Key Vault 中导入证书。 有关详细信息,请参阅教程:在 Azure Key Vault 中导入证书。 请确保证书包含整个证书链。

在 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_AZURE_SPRING_APPS='name-of-certificate-in-Azure-Spring-Apps'
export CERT_NAME_IN_KEY_VAULT='name-of-certificate-with-intermediaries-in-key-vault'
export DOMAIN_NAME=myapp.mydomain.com

# provide permissions to Azure Spring Apps to read the certificate from Key Vault:
export VAULTURI=$(az keyvault show \
    --resource-group $KV_RG \
    --name $KV_NAME \
    --query properties.vaultUri \
    --output tsv)

# get the object id for the Azure Spring Apps Domain-Management Service Principal:
export ASADM_OID=$(az ad sp show \
    --id 03b39d0f-4213-4864-a245-b1476ec03169 \
    --query objectId \
    --output tsv)

# allow this Service Principal to read and list certificates and secrets from Key Vault:
az keyvault set-policy \
    --resource-group $KV_RG \
    --name $KV_NAME \
    --object-id $ASADM_OID \
    --certificate-permissions get list \
    --secret-permissions get list

# add custom domain name and configure TLS using the certificate:
az spring certificate add \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --name $CERT_NAME_IN_AZURE_SPRING_APPS \
    --vault-certificate-name $CERT_NAME_IN_KEY_VAULT \
    --vault-uri $VAULTURI
az spring app custom-domain bind \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --domain-name $DOMAIN_NAME \
    --certificate $CERT_NAME_IN_AZURE_SPRING_APPS \
    --app $APPNAME

创建网络资源

要创建的 Azure 应用程序网关将加入与 Azure Spring Apps 服务实例相同或对等的虚拟网络。 首先使用 az network vnet subnet create 为虚拟网络中的应用程序网关创建新的子网,再使用 az network public-ip create 创建一个公共 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 来读取证书。 为此,它将使用用户分配的托管标识。 使用以下命令创建托管标识:

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 \
    --name $KV_NAME \
    --resource-group $KV_RG \
    --object-id $APPGW_IDENTITY_OID \
    --secret-permissions get list \
    --certificate-permissions get list

创建应用程序网关

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

export APPGW_NAME='name-for-application-gateway'

export KEYVAULT_SECRET_ID_FOR_CERT=$(az keyvault certificate show \
    --name $CERT_NAME_IN_KEY_VAULT \
    --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 443 \
    --http-settings-protocol Https \
    --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

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

后续步骤