Azure Spring Apps インスタンスのエグレス トラフィックを制御する
Note
Basic、Standard、Enterprise プランは、2025 年 3 月中旬以降非推奨になり、廃止期間は 3 年間です。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の廃止のお知らせ」を参照してください。
Standard 従量課金と専用プランは、2024 年 9 月 30 日以降に非推奨になり、6 か月後に完全にシャットダウンされます。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の Standard 従量課金および専用プランを Azure Container Apps に移行する」を参照してください。
この記事の適用対象: ✔️ Java ✔️ C#
この記事の適用対象: ✔️ Basic または Standard ✔️ Enterprise
この記事では、Azure Spring Apps でホストされているアプリケーションからの送信トラフィックをセキュリティで保護する方法について説明します。 この記事では、ユーザー定義ルートの例を示します。 ユーザー定義ルートは、エグレス トラフィックをフル制御できるようにする高度な機能です。 Azure Spring Apps の自動生成されたパブリック IP アドレスを禁止するなどのシナリオでは、ユーザー定義ルートを使用できます。
前提条件
- 仮想ネットワークに Azure Spring Apps をデプロイするためのすべての前提条件
2022-09-01 preview
以降の API バージョン- Azure CLI バージョン 1.17 以降
- 次の記事の情報をよく理解していること。
ユーザー定義ルートを使用して仮想ネットワークを作成する
次の図は、ユーザー定義ルート (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"
複数のサブネットを含んだ仮想ネットワークを作成する
このセクションでは、ユーザー アプリ用、サービス ランタイム用、ファイアウォール用の 3 つのサブネットを使用して仮想ネットワークをプロビジョニングする方法について説明します。
次の例に示すように、最初にリソース グループを作成します。
# Create a resource group.
az group create --name $RG --location $LOC
続いて、次の例に示すように、Azure Spring Apps および Azure Firewall インスタンスをホストする 3 つのサブネットを含む仮想ネットワークを作成します。
# 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 Firewall インスタンスを設定する
次のコマンドで、ユーザー定義ルートを使用して Azure Firewall インスタンスを作成および設定し、Azure Firewall アウトバウンド規則を構成します。 このファイアウォールを使用すると、Azure Spring Apps から詳細なエグレス トラフィック規則を構成できます。
重要
クラスターまたはアプリケーションにより、同じ送信先または送信先の小さいサブセットに対して多数の送信接続が作成される場合、フロントエンド IP アドレスあたりの最大ポート数に達するのを防ぐため、より多くのファイアウォール フロントエンド IP アドレスが必要になることがあります。 複数の IP アドレスを使用して Azure Firewall インスタンスを作成する方法の詳細については、クイックスタート: 複数のパブリック IP アドレスを使用した Azure Firewall インスタンスの作成 - ARM テンプレートに関するページを参照してください。 Azure Firewall フロントエンド アドレスとして使用する Standard SKU のパブリック IP リソースを作成します。
az network public-ip create \
--resource-group $RG \
--name $FWPUBLICIP_NAME -l $LOC \
--sku "Standard"
次の例では、Azure Firewall プレビュー CLI 拡張機能をインストールし、Azure Firewall をデプロイする方法を示します。
# 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 アドレスをファイアウォール フロントエンドに割り当てる方法を示します。
Note
Azure Firewall インスタンスへのパブリック IP アドレスの設定には数分かかる場合があります。 ネットワーク 規則で完全修飾ドメイン名 (FQDN) を使用するには、DNS プロキシを有効にします。 プロキシを有効にすると、ファイアウォールではポート 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 Firewall へのホップを含むユーザー定義ルートを作成する
Azure では、Azure のサブネット、仮想ネットワーク、およびオンプレミスのネットワーク間のトラフィックが自動的にルーティングされます。 Azure での既定のルーティングを変更する場合は、ルート テーブルを作成します。
次の例では、指定したサブネットに関連付けるルート テーブルの作成方法を示します。 ルート テーブルでは、作成した Azure Firewall インスタンス内と同様に、ネクスト ホップを定義します。 各サブネットには 1 つのルート テーブルを関連付けることができます。また、ルート テーブルが関連付けられない場合もあります。
# 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 Apps の実行に関するお客様の責任」を参照してください。
# 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 サブネット内にトラフィックをルーティングします。