在虚拟网络中使用端到端 TLS 公开应用程序
注意
基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告。
标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。
本文介绍如何使用应用程序网关向 Internet 公开应用程序。 在虚拟网络中部署 Azure Spring Apps 服务实例时,只能在专用网络中访问该服务实例上的应用程序。 若要使应用程序可在 Internet 上访问,需要与 Azure 应用程序网关集成。
先决条件
- Azure CLI 2.0.4 版或更高版本。
- 部署在虚拟网络中的 Azure Spring Apps 服务实例,其应用程序可使用默认
.private.microservices.azure.cn
域后缀通过专用网络进行访问。 有关详细信息,请参阅在虚拟网络中部署 Azure Spring Apps - 用于访问应用程序的自定义域。
- 存储在 Key Vault 中的证书,该证书与用于建立 HTTPS 侦听器的自定义域匹配。 有关详细信息,请参阅教程:在 Azure Key Vault 中导入证书。
为 Azure Spring Apps 配置应用程序网关
建议使浏览器显示的域名与应用程序网关用于将流量定向到 Azure Spring Apps 后端的主机名相同。 当使用应用程序网关公开在 Azure Spring Apps 中托管并驻留在虚拟网络中的应用程序时,此建议将提供最佳体验。 如果应用程序网关公开的域不同于 Azure Spring Apps 接受的域,则可能破坏 Cookie 和生成的重定向 URL(举例而言)。 有关详细信息,请参阅主机名保留。
若要在 Azure Spring Apps 前面配置应用程序网关,请使用以下步骤。
- 请按照在虚拟网络中部署 Azure Spring Apps 中的说明操作。
- 请按照在专用网络中访问应用程序中的说明操作。
- 获取所选域的证书,并将其存储在 Key Vault 中。 有关详细信息,请参阅教程:在 Azure Key Vault 中导入证书。
- 在部署到 Azure Spring Apps 的应用上,从 Key Vault 配置自定义域和相应证书。 有关详细信息,请参阅教程:将现有的自定义域映射到 Azure Spring Apps。
- 在根据以下列表配置的虚拟网络中部署应用程序网关:
- 在后端池中使用 Azure Spring Apps,由后缀为
private.microservices.azure.cn
的域引用。 - 使用 Key Vault 中的相同证书包含 HTTPS 侦听器。
- 使用 HTTP 设置配置虚拟网络,该设置使用在 Azure Spring Apps 上配置的自定义域名,而不是后缀为
private.microservices.azure.cn
的域名。
- 在后端池中使用 Azure Spring Apps,由后缀为
- 将公共 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
你现可使用公共域名访问应用程序。