在虛擬網路中使用端對端 TLS 公開應用程式

注意

基本標準和企業方案將從 2025 年 3 月中旬開始淘汰,並停用 3 年。 建議您轉換至 Azure Container Apps。 如需詳細資訊,請參閱 Azure Spring Apps 淘汰公告

標準 耗用量和專用 方案將從 2024 年 9 月 30 日起淘汰,並在六個月後完成關閉。 建議您轉換至 Azure Container Apps。 如需詳細資訊,請參閱 將 Azure Spring Apps 標準取用和專用方案遷移至 Azure Container Apps

本文適用於: ✔️ 基本/標準 ✔️ 企業

本文說明如何使用應用程式閘道向網際網路公開應用程式。 當您的虛擬網路中部署 Azure Spring Apps 服務實例時,服務實例上的應用程式只能在專用網中存取。 若要讓應用程式可在網際網路上存取,您需要與 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.azuremicroservices.io 的網域所參考。
    • 使用來自 Key Vault 的相同憑證來包含 HTTPS 接聽程式。
    • 使用在 Azure Spring Apps 上所設定自訂網域名稱的 HTTP 設定來設定虛擬網路,而不是使用以 private.azuremicroservices.io 作為尾碼的網域來設定虛擬網路。
  6. 將您的公用 DNS 設定為指向 應用程式閘道。

定義變數

接下來,使用下列命令來定義您所建立資源群組和虛擬網路的變數,如同在虛擬網路中部署 Azure Spring Apps 中所指示。 根據您的實際環境自訂值。 當您定義 SPRING_APP_PRIVATE_FQDN 時,請從 URI 中移除 https://

export SUBSCRIPTION='subscription-id'
export RESOURCE_GROUP='my-resource-group'
export LOCATION='eastus'
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.azuremicroservices.io'
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 金鑰保存庫 中匯入憑證。 如需詳細資訊,請參閱教學課程:在 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在虛擬網路中建立 應用程式閘道 的新子網,並使用 建立公用IP位址作為 應用程式閘道az network public-ip create的前端。

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

建立 應用程式閘道 的受控識別

應用程式閘道 必須能夠存取 金鑰保存庫 才能讀取憑證。 若要這樣做,它會使用使用者指派的 受控識別。 使用下列命令建立受控識別:

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

然後擷取受控識別的 objectId,因為它稍後會用來授與許可權,以在 金鑰保存庫 中存取憑證:

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 上設定原則

使用下列命令設定 金鑰保存庫,讓 應用程式閘道 的受控識別能夠存取儲存在 金鑰保存庫 中的憑證:

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) 指定為後端集區中的伺服器。 請務必使用使用者指派的受控識別,並使用憑證的秘密標識碼指向 金鑰保存庫 中的憑證。 然後使用 更新 HTTP 設定 az network application-gateway http-settings update ,以使用公用主機名。

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.azuremicroservices.io” 的網域,以使用 將流量傳送至 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.azuremicroservices.io",
              "health": "Healthy",
              "healthProbeLog": "Success. Received 200 status code",
              "ipConfiguration": null
            }
          ]
        }
      ]
    }
  ]
}

設定 DNS 並存取應用程式

現在,將公用 DNS 設定為使用 CNAME 或 A-record 指向 應用程式閘道。 您可以使用下列命令來尋找 應用程式閘道 的公用位址:

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

您現在可以使用公用網域名稱來存取應用程式。

下一步