Share via


Azure Spring 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 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에서 세분화된 송신 트래픽 규칙을 구성할 수 있습니다.

Important

클러스터 또는 애플리케이션이 동일한 대상 또는 작은 대상 하위 집합으로 향하는 많은 수의 아웃바운드 연결을 만드는 경우 프런트 엔드 IP 주소당 최대 포트에 도달하지 않도록 더 많은 방화벽 프런트 엔드 IP 주소가 필요할 수 있습니다. 여러 IP 주소를 사용하여 Azure Firewall 인스턴스를 만드는 방법에 대한 자세한 내용은 빠른 시작: 여러 공용 IP 주소를 사용하여 Azure Firewall 인스턴스 만들기 - ARM 템플릿을 참조하세요. Azure Firewall 프런트 엔드 주소로 사용할 표준 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 주소를 방화벽 프런트 엔드에 할당하는 방법을 보여 줍니다.

참고 항목

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 인스턴스에서와 같이 다음 홉을 정의합니다. 각 서브넷에는 하나의 경로 테이블이 연결되어 있거나 연결된 경로 테이블이 없을 수 있습니다.

# 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 서브넷으로 라우팅합니다.

다음 단계