分享方式:


為 Azure Spring 應用程式執行個體控制輸出流量

注意

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

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

本文適用於: ✔️ Java ✔️ C#

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

本文說明如何保護來自 Azure Spring Apps 中裝載之應用程式的輸出流量。 本文提供使用者定義的路由範例。 使用者定義的路由是一項進階功能,可讓您完全控制輸出流量。 您可以在不允許 Azure Spring Apps 自動產生的公用 IP 位址等案例中使用使用者定義的路由。

必要條件

使用使用者定義的路由建立虛擬網路

下圖顯示使用使用者定義路由 (UDR) 的 Azure Spring Apps 虛擬網路範例。

此圖顯示使用使用者定義路由 (UDR) 的 Azure Spring Apps 虛擬網路架構。

下圖說明架構的下列功能:

  • 公用輸入流量必須流經防火牆篩選器。
  • 每個 Azure Spring Apps 實例都會隔離在專用子網內。
  • 客戶擁有和管理防火牆。
  • 此結構可確保防火牆會針對您需要的所有函式啟用狀況良好的環境。
  • Azure Spring Apps 不會自動產生公用 IP 資源。

定義環境變數

下列範例示範如何定義一組要用於資源建立的環境變數:

export PREFIX="asa-egress"
export RG="${PREFIX}-rg"
export LOC="eastus"
export ASANAME="${PREFIX}"
export VNET_NAME="${PREFIX}-vnet"
export ASA_APP_SUBNET_NAME="asa-app-subnet"
export ASA_SERVICE_RUNTIME_SUBNET_NAME="asa-service-runtime-subnet"
# Do not change FWSUBNET_NAME. This is currently a requirement for Azure Firewall.
export FWSUBNET_NAME="AzureFirewallSubnet"
export FWNAME="${PREFIX}-fw"
export FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
export FWIPCONFIG_NAME="${PREFIX}-fwconfig"
export APP_ROUTE_TABLE_NAME="${PREFIX}-app-rt"
export SERVICE_RUNTIME_ROUTE_TABLE_NAME="${PREFIX}-service-runtime-rt"
export FWROUTE_NAME="${PREFIX}-fwrn"
export ASA_NAME="${PREFIX}-instance"

建立有多個子網路的虛擬網路

本節說明如何布建具有三個不同子網的虛擬網路:一個用於使用者應用程式、一個用於服務運行時間,另一個用於防火牆。

首先建立資源群組,如下列範例所示:

# Create a resource group.

az group create --name $RG --location $LOC

然後建立具有三個子網的虛擬網路來裝載 Azure Spring Apps 和 Azure 防火牆 實例,如下列範例所示:

# Dedicated virtual network with an Azure Spring Apps app subnet.

az network vnet create \
    --resource-group $RG \
    --name $VNET_NAME \
    --location $LOC \
    --address-prefixes 10.42.0.0/16 \
    --subnet-name $ASA_APP_SUBNET_NAME \
    --subnet-prefix 10.42.1.0/24

# Dedicated subnet for the Azure Spring Apps service runtime subnet.

az network vnet subnet create \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_SERVICE_RUNTIME_SUBNET_NAME\
    --address-prefix 10.42.2.0/24

# Dedicated subnet for Azure Firewall. (Firewall name can't be changed.)

az network vnet subnet create \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $FWSUBNET_NAME \
    --address-prefix 10.42.3.0/24

使用使用者定義的路由設定 Azure 防火牆 實例

使用下列命令來建立和設定具有使用者定義路由的 Azure 防火牆 實例,以及設定 Azure 防火牆 輸出規則。 防火牆可讓您從 Azure Spring Apps 設定細微的輸出流量規則。

重要

如果您的叢集或應用程式建立大量導向至相同目的地或目的地子集的輸出連線,您可能需要更多防火牆前端IP位址,以避免達到每個前端IP位址的最大埠。 如需如何使用多個IP位址建立 Azure 防火牆 實例的詳細資訊,請參閱快速入門:建立具有多個公用IP位址的Azure 防火牆 實例 - ARM 範本。 建立標準 SKU 公用 IP 資源,以作為 Azure 防火牆 前端位址。

az network public-ip create \
    --resource-group $RG \
    --name $FWPUBLICIP_NAME -l $LOC \
    --sku "Standard"

下列範例示範如何安裝 Azure 防火牆 預覽 CLI 延伸模組並部署 Azure 防火牆:

# Install the Azure Firewall preview CLI extension.

az extension add --name azure-firewall

# Deploy Azure Firewall.

az network firewall create \
    --resource-group $RG \
    --name $FWNAME -l $LOC \
    --enable-dns-proxy true

下列範例示範如何將您建立的IP位址指派給防火牆前端。

注意

將公用IP位址設定為 Azure 防火牆 實例可能需要幾分鐘的時間。 若要在網路規則上使用完整功能變數名稱 (FQDN),請啟用 DNS Proxy。 啟用 Proxy 之後,防火牆會接聽埠 53,並將 DNS 要求轉送至指定的 DNS 伺服器。 然後,防火牆可以自動轉譯 FQDN。

# Configure the firewall IP address.

az network firewall ip-config create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --name $FWIPCONFIG_NAME \
    --public-ip-address $FWPUBLICIP_NAME \
    --vnet-name $VNET_NAME

作業完成後,請儲存防火牆的前端IP位址以供稍後設定,如下列範例所示:

# Capture the firewall IP address for later use.

export FWPUBLIC_IP=$(az network public-ip show \
    --resource-group $RG \
    --name $FWPUBLICIP_NAME \
    --query "ipAddress" \
    --output tsv)
export FWPRIVATE_IP=$(az network firewall show \
    --resource-group $RG \
    --name $FWNAME \
    --query "ipConfigurations[0].privateIPAddress" \
    --output tsv | tr -d '[:space:]')

建立具有躍點的用戶定義路由以 Azure 防火牆

Azure 會自動路由傳送 Azure 子網路、虛擬網路及內部部署網路之間的流量。 如果您想要變更 Azure 中的預設路由,請建立路由表。

下列範例示範如何建立要與指定子網相關聯的路由表。 路由表會定義下一個躍點,如您所建立的 Azure 防火牆 實例所示。 每個子網可以有一個與其相關聯的路由表,或可能沒有相關聯的路由表。

# Create a user-defined route and add a route for Azure Firewall.

az network route-table create \
    --resource-group $RG -l $LOC \
    --name $APP_ROUTE_TABLE_NAME
az network route-table route create \
    --resource-group $RG \
    --name $FWROUTE_NAME \
    --route-table-name $APP_ROUTE_TABLE_NAME \
    --address-prefix 0.0.0.0/0 \
    --next-hop-type VirtualAppliance \
    --next-hop-ip-address $FWPRIVATE_IP
az network route-table create \
    --resource-group $RG -l $LOC \
    --name $SERVICE_RUNTIME_ROUTE_TABLE_NAME
az network route-table route create \
    --resource-group $RG \
    --name $FWROUTE_NAME \
    --route-table-name $SERVICE_RUNTIME_ROUTE_TABLE_NAME \
    --address-prefix 0.0.0.0/0 \
    --next-hop-type VirtualAppliance \
    --next-hop-ip-address $FWPRIVATE_IP

新增防火牆規則

下列範例示範如何將規則新增至防火牆。 如需詳細資訊,請參閱在虛擬網路中執行 Azure Spring 應用程式的客戶責任

# Add firewall network rules.

az network firewall network-rule create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --collection-name 'asafwnr' \
    --name 'springcloudtcp' \
    --protocols 'TCP' \
    --source-addresses '*' \
    --destination-addresses "AzureCloud" \
    --destination-ports 443 445 \
    --action allow \
    --priority 100

# Add firewall application rules.

az network firewall application-rule create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --collection-name 'aksfwar'\
    --name 'fqdn' \
    --source-addresses '*' \
    --protocols 'https=443' \
    --fqdn-tags "AzureKubernetesService" \
    --action allow \
    --priority 100

建立路由表與子網的關聯

若要讓叢集與防火牆產生關聯,請確定叢集的專用子網會參考您所建立的路由表。 應用程式和服務運行時間子網必須與對應的路由表相關聯。 下列範例示範如何將路由表與子網產生關聯:

# Associate the route table with a next hop to the firewall for the Azure Spring Apps subnet.

az network vnet subnet update \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_APP_SUBNET_NAME \
    --route-table $APP_ROUTE_TABLE_NAME

az network vnet subnet update
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_SERVICE_RUNTIME_SUBNET_NAME \
    --route-table $SERVICE_RUNTIME_ROUTE_TABLE_NAME

新增 Azure Spring Apps 資源提供者的角色

下列範例示範如何為 Azure Spring Apps 資源提供者新增角色。 角色會指派給字串 e8de9221-a19c-4c81-b814-fd37c6caf9d2所識別的所有使用者:

export VIRTUAL_NETWORK_RESOURCE_ID=$(az network vnet show \
    --name $VNET_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${VIRTUAL_NETWORK_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

export APP_ROUTE_TABLE_RESOURCE_ID=$(az network route-table show \
    --name $APP_ROUTE_TABLE_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${APP_ROUTE_TABLE_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

export SERVICE_RUNTIME_ROUTE_TABLE_RESOURCE_ID=$(az network route-table show \
    --name $SERVICE_RUNTIME_ROUTE_TABLE_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${SERVICE_RUNTIME_ROUTE_TABLE_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

使用使用者定義的路由建立 Azure Spring Apps 實例

下列範例示範如何使用使用者定義的路由建立 Azure Spring Apps 實例:

az spring create \
    --name $ASA_NAME \
    --resource-group $RG \
    --vnet $VNET_NAME \
    --app-subnet $ASA_APP_SUBNET_NAME \
    --service-runtime-subnet $ASA_SERVICE_RUNTIME_SUBNET_NAME \
    --outbound-type userDefinedRouting

您現在可以從因特網存取防火牆的公用IP位址。 防火牆會根據您的路由規則,將流量路由傳送至 Azure Spring Apps 子網。

下一步