내부 가상 네트워크의 API Management를 Application Gateway와 통합

적용 대상: 개발자 | 프리미엄

Azure API Management를 내부 모드의 가상 네트워크에서 구성하면 가상 네트워크 내에서만 액세스할 수 있습니다. Azure Application Gateway는 계층 7 부하 분산 장치 역할을 하는 PaaS(Platform as a Service)입니다. 역방향 프록시 서비스 역할을 하고 제품에 Azure WAF(Web Application Firewall)를 제공합니다.

내부 가상 네트워크에 프로비저닝된 API Management를 Application Gateway 프런트 엔드에 결합하여 다음을 수행할 수 있습니다.

  • 내부 소비자 및 외부 소비자의 소비에 대해 동일한 API Management 리소스를 사용합니다.
  • 단일 API Management 리소스를 사용하며 외부 소비자가 사용할 수 있는 API Management에서 정의된 API의 하위 집합을 갖습니다.
  • 퍼블릭 인터넷에서 API Management에 대한 액세스를 켜기 및 끄기로 전환하는 턴키 방법을 제공합니다.

아키텍처 지침은 다음을 참조하세요.

참고 항목

이 문서는 Application Gateway WAF_V2 SKU를 사용하도록 업데이트되었습니다.

필수 조건

참고 항목

Azure Az PowerShell 모듈을 사용하여 Azure와 상호 작용하는 것이 좋습니다. 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Azure로 마이그레이션을 참조하세요.

이 문서에 설명한 단계를 따르려면 다음 항목이 있어야 합니다.

  • 활성 Azure 구독

    Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.

  • 인증서

    • API Management 의 사용자 지정 호스트 이름에 대한 PFX(개인 정보 교환) 파일: 게이트웨이, 개발자 포털 및 관리 엔드포인트
    • PFX 인증서의 루트 인증서에 대한 CER(인증서) 파일

    자세한 내용은 백 엔드에 대한 인증서를 참조하세요. 테스트를 위해 필요에 따라 자체 서명된 인증서를 생성합니다.

  • 최신 버전의 Azure PowerShell

시나리오

이 문서에서는 내부 및 외부 소비자를 위해 단일 API Management 인스턴스를 사용하여 온-프레미스 및 클라우드 API에서 단일 프런트 엔드로 작동하도록 하는 방법을 알아봅니다. 최신 stv2(단일 테넌트 버전 2) 형식의 API Management 인스턴스를 만듭니다. Application Gateway에서 퍼블릭 및 프라이빗 수신기를 사용하는 방법을 알아봅니다. Application Gateway에서 사용할 수 있는 라우팅 기능을 사용하여 외부 사용을 위해 API의 하위 집합만 노출하는 방법을 알아봅니다. 이 예제에서 API는 녹색으로 강조 표시됩니다.

첫 번째 설정 예제에서 모든 API는 가상 네트워크 내에서만 관리됩니다. 내부 소비자는 모든 내부 및 외부 API에 액세스할 수 있습니다. 트래픽은 인터넷으로 나가지 않습니다. Azure ExpressRoute 회로를 통해 고성능 연결이 제공될 수 있습니다. 이 예제에서 내부 소비자는 주황색으로 강조 표시됩니다.

URL 경로를 보여 주는 다이어그램

API Management 및 Application Gateway 통합을 위해 무엇이 필요한가요?

  • 백 엔드 서버 풀: 이 서버 풀은 API Management의 내부 가상 IP 주소입니다.
  • 백 엔드 서버 풀 설정: 모든 풀에는 포트, 프로토콜 및 쿠키 기반의 선호도와 같은 설정이 있습니다. 이러한 설정은 풀 내의 모든 서버에 적용됩니다.
  • 프런트 엔드 포트: 이 공용 포트는 애플리케이션 게이트웨이에서 열립니다. 도달한 트래픽은 백 엔드 서버 중의 하나로 리디렉션됩니다.
  • 수신기: 수신기에는 프런트 엔드 포트, 프로토콜(Http 또는 Https, 이 값은 대/소문자 구분) 및 TLS(전송 계층 보안) 인증서 이름(TLS 오프로드를 구성하는 경우)이 있습니다.
  • 규칙: 규칙은 수신기를 백 엔드 서버 풀에 바인딩합니다.
  • 사용자 정의 상태 프로브: 기본적으로 Application Gateway는 IP 주소 기반 프로브를 사용하여 BackendAddressPool의 어떤 서버가 활성 상태인지 파악합니다. API Management 서비스는 올바른 호스트 헤더가 있는 요청에만 응답하므로 기본 프로브는 실패합니다. 서비스가 활성 상태이고 요청을 전달해야 한다는 것을 Application Gateway가 결정할 수 있도록 사용자 지정 상태 프로브를 정의합니다.
  • 사용자 지정 도메인 인증서: 인터넷에서 API Management에 액세스하려면 Application Gateway 프런트 엔드 IP 주소에 해당 호스트 이름을 매핑하는 DNS(Domain Name System) 레코드를 만듭니다. 이 매핑은 API Management에 전송된 호스트 헤더 및 인증서가 유효한지 확인합니다. 이 예제에서는 세 개의 인증서를 사용합니다. API Management의 게이트웨이(백 엔드), 개발자 포털 및 관리 엔드포인트용입니다.

Application Gateway를 통해 외부에서 개발자 포털 및 관리 엔드포인트 노출

이 문서에서는 Application Gateway를 통해 외부 대상에게 개발자 포털관리 엔드포인트도 노출합니다. 각 엔드포인트에 대한 수신기, 프로브, 설정 및 규칙을 만들려면 추가 단계가 필요합니다. 모든 세부 정보는 해당 단계에서 제공됩니다.

Microsoft Entra ID 또는 타사 인증을 사용하는 경우 Application Gateway에서 쿠키 기반 세션 선호도 기능을 사용하도록 설정합니다.

Warning

Application Gateway WAF가 개발자 포털에서 OpenAPI 사양 다운로드를 중단하지 않도록 하려면 방화벽 규칙 942200 - "Detects MySQL comment-/space-obfuscated injections and backtick termination"을 사용하지 않도록 설정합니다.

포털의 기능을 손상시킬 수 있는 Application Gateway WAF 규칙은 다음과 같습니다.

  • 관리 모드의 경우 920300, 920330, 931130, 942100, 942110, 942180, 942200, 942260, 942340, 942370
  • 게시된 포털의 경우 942200, 942260, 942370, 942430, 942440

변수 설정

이 가이드 전체에서 여러 변수를 정의해야 합니다. 명명은 클라우드 채택 프레임워크 약어 지침을 기반으로 합니다.

# These variables must be changed.
$subscriptionId = "00000000-0000-0000-0000-000000000000"      # GUID of your Azure subscription
$domain = "contoso.net"                                       # The custom domain for your certificate
$apimServiceName = "apim-contoso"                             # API Management service instance name, must be globally unique    
$apimDomainNameLabel = $apimServiceName                       # Domain name label for API Management's public IP address, must be globally unique
$apimAdminEmail = "admin@contoso.net"                         # Administrator's email address - use your email address

$gatewayHostname = "api.$domain"                              # API gateway host
$portalHostname = "portal.$domain"                            # API developer portal host
$managementHostname = "management.$domain"                    # API management endpoint host

$baseCertPath = "C:\Users\Contoso\"                           # The base path where all certificates are stored
$trustedRootCertCerPath = "${baseCertPath}trustedroot.cer"    # Full path to contoso.net trusted root .cer file
$gatewayCertPfxPath = "${baseCertPath}gateway.pfx"            # Full path to api.contoso.net .pfx file
$portalCertPfxPath = "${baseCertPath}portal.pfx"              # Full path to portal.contoso.net .pfx file
$managementCertPfxPath = "${baseCertPath}management.pfx"      # Full path to management.contoso.net .pfx file

$gatewayCertPfxPassword = "certificatePassword123"            # Password for api.contoso.net pfx certificate
$portalCertPfxPassword = "certificatePassword123"             # Password for portal.contoso.net pfx certificate
$managementCertPfxPassword = "certificatePassword123"         # Password for management.contoso.net pfx certificate

# These variables may be changed.
$resGroupName = "rg-apim-agw"                                 # Resource group name that will hold all assets
$location = "West US"                                         # Azure region that will hold all assets
$apimOrganization = "Contoso"                                 # Organization name    
$appgwName = "agw-contoso"                                    # The name of the Application Gateway

Resource Manager에 대한 리소스 그룹 만들기

Azure Resource Manager에 대한 리소스 그룹을 만들려면 다음을 수행합니다.

  1. Azure에 로그인합니다.

    Connect-AzAccount
    
  2. 자격 증명을 사용하여 인증합니다.

  3. 원하는 구독을 선택합니다.

    Get-AzSubscription -Subscriptionid $subscriptionId | Select-AzSubscription
    
  4. 리소스 그룹을 만듭니다. 기존 리소스 그룹을 사용하는 경우에는 이 단계를 건너뛸 수 있습니다.

    New-AzResourceGroup -Name $resGroupName -Location $location
    

Resource Manager에서는 모든 리소스 그룹이 위치를 지정해야 합니다. 이 위치는 해당 리소스 그룹에서 리소스의 기본 위치로 사용됩니다. 애플리케이션 게이트웨이를 만들기 위한 모든 명령이 동일한 리소스 그룹을 사용하는지 확인합니다.

애플리케이션 게이트웨이에 대한 가상 네트워크 및 서브넷 만들기

다음 예제에서는 Resource Manager를 사용하여 가상 네트워크를 만드는 방법을 보여 줍니다. 이 예제의 가상 네트워크는 Application Gateway 및 API Management에 대한 별도의 서브넷으로 구성됩니다.

  1. Application Gateway IP 주소를 설정합니다.

    참고 항목

    퍼블릭 및 프라이빗 수신기가 있으므로 공용 및 개인 IP 주소가 필요합니다. 고정 공용 IP 주소를 만들어야 하는 반면 개인 IP 주소는 애플리케이션 게이트웨이와 연결된 서브넷에서 선택해야 합니다. 개인 IP 주소가 임의로 선택되었습니다.

    $appGatewayExternalIP = New-AzPublicIpAddress -ResourceGroupName $resGroupName -name "pip-ag" -location $location -AllocationMethod Static -Sku Standard -Force
    $appGatewayInternalIP = "10.0.0.100"
    
    [String[]]$appGwNsgDestIPs = $appGatewayInternalIP, $appGatewayExternalIP.IpAddress
    
  2. Application Gateway 서브넷에 대한 NSG(네트워크 보안 그룹) 및 NSG 규칙을 만듭니다.

    $appGwRule1 = New-AzNetworkSecurityRuleConfig -Name appgw-in -Description "AppGw inbound" `
        -Access Allow -Protocol * -Direction Inbound -Priority 100 -SourceAddressPrefix `
        GatewayManager -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 65200-65535
    
    $appGwRule2 = New-AzNetworkSecurityRuleConfig -Name appgw-in-internet -Description "AppGw inbound Internet" `
        -Access Allow -Protocol "TCP" -Direction Inbound -Priority 110 -SourceAddressPrefix `
        Internet -SourcePortRange * -DestinationAddressPrefix $appGwNsgDestIPs -DestinationPortRange 443
    
    $appGwNsg = New-AzNetworkSecurityGroup -ResourceGroupName $resGroupName -Location $location -Name `
        "nsg-agw" -SecurityRules $appGwRule1, $appGwRule2
    
  3. API Management 서브넷에 대한 NSG(네트워크 보안 그룹) 및 NSG 규칙을 만듭니다. API Management stv2에는 몇 가지 특정 NSG 규칙이 필요합니다.

    $apimRule1 = New-AzNetworkSecurityRuleConfig -Name APIM-Management -Description "APIM inbound" `
        -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 -SourceAddressPrefix ApiManagement `
        -SourcePortRange * -DestinationAddressPrefix VirtualNetwork -DestinationPortRange 3443
    
    $apimRule2 = New-AzNetworkSecurityRuleConfig -Name AllowAppGatewayToAPIM -Description "Allows inbound App Gateway traffic to APIM" `
        -Access Allow -Protocol Tcp -Direction Inbound -Priority 110 -SourceAddressPrefix "10.0.0.0/24" `
        -SourcePortRange * -DestinationAddressPrefix "10.0.1.0/24" -DestinationPortRange 443
    
    $apimRule3 = New-AzNetworkSecurityRuleConfig -Name AllowAzureLoadBalancer -Description "Allows inbound Azure Infrastructure Load Balancer traffic to APIM" `
        -Access Allow -Protocol Tcp -Direction Inbound -Priority 120 -SourceAddressPrefix AzureLoadBalancer `
        -SourcePortRange * -DestinationAddressPrefix "10.0.1.0/24" -DestinationPortRange 6390
    
    $apimRule4 = New-AzNetworkSecurityRuleConfig -Name AllowKeyVault -Description "Allows outbound traffic to Azure Key Vault" `
        -Access Allow -Protocol Tcp -Direction Outbound -Priority 100 -SourceAddressPrefix "10.0.1.0/24" `
        -SourcePortRange * -DestinationAddressPrefix AzureKeyVault -DestinationPortRange 443
    
    $apimNsg = New-AzNetworkSecurityGroup -ResourceGroupName $resGroupName -Location $location -Name `
        "nsg-apim" -SecurityRules $apimRule1, $apimRule2, $apimRule3, $apimRule4
    
  4. 주소 범위 10.0.0.0/24를 가상 네트워크를 만드는 동안 Application Gateway에 사용할 서브넷 변수에 할당합니다.

    $appGatewaySubnet = New-AzVirtualNetworkSubnetConfig -Name "appGatewaySubnet" -NetworkSecurityGroup $appGwNsg -AddressPrefix "10.0.0.0/24"
    
  5. 가상 네트워크를 만드는 동안 주소 범위 10.0.1.0/24를 API Management에 사용할 서브넷 변수에 할당합니다.

    $apimSubnet = New-AzVirtualNetworkSubnetConfig -Name "apimSubnet" -NetworkSecurityGroup $apimNsg -AddressPrefix "10.0.1.0/24"
    
  6. vnet-contoso라는 가상 네트워크를 만듭니다. 접두사 10.0.0.0/16과 서브넷 10.0.0.0/24 및 10.0.1.0/24를 사용합니다.

    $vnet = New-AzVirtualNetwork -Name "vnet-contoso" -ResourceGroupName $resGroupName `
      -Location $location -AddressPrefix "10.0.0.0/16" -Subnet $appGatewaySubnet,$apimSubnet
    
  7. 다음 단계에 대한 서브넷 변수를 할당합니다.

    $appGatewaySubnetData = $vnet.Subnets[0]
    $apimSubnetData = $vnet.Subnets[1]
    

가상 네트워크 내부에 API Management 인스턴스 생성

다음 예제에서는 가상 네트워크에서 내부 액세스 전용으로 구성된 API Management 인스턴스를 만드는 방법을 보여 줍니다.

  1. API Management stv2에는 고유한 DomainNameLabel이 있는 공용 IP가 필요합니다.

    $apimPublicIpAddressId = New-AzPublicIpAddress -ResourceGroupName $resGroupName -name "pip-apim" -location $location `
        -AllocationMethod Static -Sku Standard -Force -DomainNameLabel $apimDomainNameLabel
    
  2. 만든 $apimSubnetData 서브넷을 사용하여 API Management 가상 네트워크 개체를 만듭니다.

    $apimVirtualNetwork = New-AzApiManagementVirtualNetwork -SubnetResourceId $apimSubnetData.Id
    
  3. 가상 네트워크 내부에 API Management 인스턴스를 만듭니다. 이 예제에서는 개발자 서비스 계층에 이 서비스를 만듭니다. API Management 인스턴스에 고유한 이름을 지정합니다.

    $apimService = New-AzApiManagement -ResourceGroupName $resGroupName -Location $location -Name $apimServiceName -Organization $apimOrganization `
        -AdminEmail $apimAdminEmail -VirtualNetwork $apimVirtualNetwork -VpnType "Internal" -Sku "Developer" -PublicIpAddressId $apimPublicIpAddressId.Id
    

이 계층에서 API Management 인스턴스를 만들고 활성화하는 데 30~40분 정도 걸릴 수 있습니다. 이전 명령이 성공한 후에 액세스를 확인하려면 내부 가상 네트워크 API Management 서비스에 액세스하는 데 필요한 DNS 구성을 참조하세요.

API Management에서 사용자 지정 도메인 이름 설정

API Management에서 사용자 지정 도메인 이름을 설정하려면 다음을 수행합니다.

  1. 도메인에 대한 프라이빗 키가 있는 인증서 및 신뢰할 수 있는 루트 인증서의 세부 정보를 사용하여 다음 변수를 초기화합니다. 이 예제에서는 api.contoso.net, portal.contoso.netmanagement.contoso.net을 사용합니다.

    $certGatewayPwd = ConvertTo-SecureString -String $gatewayCertPfxPassword -AsPlainText -Force
    $certPortalPwd = ConvertTo-SecureString -String $portalCertPfxPassword -AsPlainText -Force
    $certManagementPwd = ConvertTo-SecureString -String $managementCertPfxPassword -AsPlainText -Force
    
  2. API Management 엔드포인트에 대한 Hostname 구성 개체를 만들고 설정합니다.

    $gatewayHostnameConfig = New-AzApiManagementCustomHostnameConfiguration -Hostname $gatewayHostname `
      -HostnameType Proxy -PfxPath $gatewayCertPfxPath -PfxPassword $certGatewayPwd
    
    $portalHostnameConfig = New-AzApiManagementCustomHostnameConfiguration -Hostname $portalHostname `
      -HostnameType DeveloperPortal -PfxPath $portalCertPfxPath -PfxPassword $certPortalPwd
    
    $managementHostnameConfig = New-AzApiManagementCustomHostnameConfiguration -Hostname $managementHostname `
      -HostnameType Management -PfxPath $managementCertPfxPath -PfxPassword $certManagementPwd
    
    $apimService.ProxyCustomHostnameConfiguration = $gatewayHostnameConfig
    $apimService.PortalCustomHostnameConfiguration = $portalHostnameConfig
    $apimService.ManagementCustomHostnameConfiguration = $managementHostnameConfig
    
    Set-AzApiManagement -InputObject $apimService
    

가상 네트워크에서 DNS 확인을 위한 프라이빗 영역 구성

가상 네트워크에서 DNS 확인을 위한 프라이빗 DNS 영역을 구성하려면 다음을 수행합니다.

  1. 프라이빗 DNS 영역을 만들고 가상 네트워크를 연결합니다.

    $myZone = New-AzPrivateDnsZone -Name $domain -ResourceGroupName $resGroupName
    
    $link = New-AzPrivateDnsVirtualNetworkLink -ZoneName $domain `
      -ResourceGroupName $resGroupName -Name "mylink" `
      -VirtualNetworkId $vnet.id
    
  2. API Management의 개인 IP 주소에 매핑되는 사용자 지정 도메인 호스트 이름에 대한 A 레코드를 만듭니다.

    $apimIP = $apimService.PrivateIPAddresses[0]
    
    New-AzPrivateDnsRecordSet -Name api -RecordType A -ZoneName $domain `
      -ResourceGroupName $resGroupName -Ttl 3600 `
      -PrivateDnsRecords (New-AzPrivateDnsRecordConfig -IPv4Address $apimIP)
    
    New-AzPrivateDnsRecordSet -Name portal -RecordType A -ZoneName $domain `
      -ResourceGroupName $resGroupName -Ttl 3600 `
      -PrivateDnsRecords (New-AzPrivateDnsRecordConfig -IPv4Address $apimIP)
    
    New-AzPrivateDnsRecordSet -Name management -RecordType A -ZoneName $domain `
      -ResourceGroupName $resGroupName -Ttl 3600 `
      -PrivateDnsRecords (New-AzPrivateDnsRecordConfig -IPv4Address $apimIP)
    

애플리케이션 게이트웨이 구성 만들기

애플리케이션 게이트웨이를 만들기 전에 모든 구성 항목을 설정해야 합니다. 다음 단계에서는 Application Gateway 리소스에 필요한 구성 항목을 만듭니다.

  1. gatewayIP01이라는 Application Gateway IP 구성을 만듭니다. Application Gateway는 시작되면 구성된 서브넷에서 IP 주소를 선택하고 백 엔드 IP 풀의 IP 주소로 네트워크 트래픽을 라우팅합니다. 인스턴스마다 하나의 IP 주소를 사용합니다.

    $gipconfig = New-AzApplicationGatewayIPConfiguration -Name "gatewayIP01" -Subnet $appGatewaySubnetData
    
  2. 공용 및 개인 IP 엔드포인트에 대해 동일한 프런트 엔드 포트를 구성합니다. 이 포트는 사용자가 연결하는 포트입니다. 둘 다에 대해 동일한 포트를 사용하여 동일한 포트에서 내부 및 외부 요청을 수행할 수 있도록 합니다.

    $fp01 = New-AzApplicationGatewayFrontendPort -Name "port01"  -Port 443
    
  3. 두 개의 프런트 엔드 IP 주소(공용 주소 1개와 프라이빗 주소 1개)를 구성합니다. 개인 IP 주소는 인덱스 0에서 처음으로 만들어진 애플리케이션 게이트웨이 서브넷에서 가져옵니다.

    $fipconfig01 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-public-ip" -PublicIPAddress $appGatewayExternalIP
    
    $fipconfig02 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-private-ip" -PrivateIPAddress $appGatewayInternalIP `
      -Subnet $vnet.Subnets[0]
    
  4. 애플리케이션 게이트웨이에 대한 인증서를 구성합니다. 통과하는 트래픽을 암호 해독하고 다시 암호화하는 데 사용됩니다.

    참고 항목

    Application Gateway는 사용자 지정 TLS 옵션 정의, 특정 TLS 프로토콜 버전을 사용하지 않도록 설정, 암호 그룹 및 기본 설정 순서 지정을 지원합니다. 구성 가능한 TLS 옵션에 대한 자세한 내용은 TLS 정책 개요를 참조하세요.

    $certGateway = New-AzApplicationGatewaySslCertificate -Name "gatewaycert" `
      -CertificateFile $gatewayCertPfxPath -Password $certGatewayPwd
    
    $certPortal = New-AzApplicationGatewaySslCertificate -Name "portalcert" `
      -CertificateFile $portalCertPfxPath -Password $certPortalPwd
    
    $certManagement = New-AzApplicationGatewaySslCertificate -Name "managementcert" `
      -CertificateFile $managementCertPfxPath -Password $certManagementPwd
    
  5. 애플리케이션 게이트웨이에 대한 HTTP 수신기를 만듭니다. 프런트 엔드 IP 구성, 포트 및 TLS/SSL 인증서를 할당합니다.

    # Public/external listeners
    $gatewayListener = New-AzApplicationGatewayHttpListener -Name "gatewaylistener" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig01 -FrontendPort $fp01 `
      -SslCertificate $certGateway -HostName $gatewayHostname -RequireServerNameIndication true
    
    $portalListener = New-AzApplicationGatewayHttpListener -Name "portallistener" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig01 -FrontendPort $fp01 `
      -SslCertificate $certPortal -HostName $portalHostname -RequireServerNameIndication true
    
    $managementListener = New-AzApplicationGatewayHttpListener -Name "managementlistener" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig01 -FrontendPort $fp01 `
      -SslCertificate $certManagement -HostName $managementHostname -RequireServerNameIndication true
    
    # Private/internal listeners
    $gatewayListenerPrivate = New-AzApplicationGatewayHttpListener -Name "gatewaylistener-private" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig02 -FrontendPort $fp01 `
      -SslCertificate $certGateway -HostName $gatewayHostname -RequireServerNameIndication true
    
    $portalListenerPrivate = New-AzApplicationGatewayHttpListener -Name "portallistener-private" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig02 -FrontendPort $fp01 `
      -SslCertificate $certPortal -HostName $portalHostname -RequireServerNameIndication true
    
    $managementListenerPrivate = New-AzApplicationGatewayHttpListener -Name "managementlistener-private" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig02 -FrontendPort $fp01 `
      -SslCertificate $certManagement -HostName $managementHostname -RequireServerNameIndication true
    
  6. API Management ContosoApi 게이트웨이 도메인 엔드포인트에 사용자 지정 프로브를 만듭니다. 경로 /status-0123456789abcdef는 모든 API Management 인스턴스에서 호스트되는 기본 상태 엔드포인트입니다. api.contoso.net을 사용자 지정 프로브 호스트 이름으로 지정하여 TLS/SSL 인증서로 보호합니다.

    참고 항목

    호스트 이름 contosoapi.azure-api.net은 서비스 contosoapi가 공용 Azure에서 생성될 때 구성된 기본 프록시 호스트 이름입니다.

    $apimGatewayProbe = New-AzApplicationGatewayProbeConfig -Name "apimgatewayprobe" `
      -Protocol "Https" -HostName $gatewayHostname -Path "/status-0123456789abcdef" `
      -Interval 30 -Timeout 120 -UnhealthyThreshold 8
    
    $apimPortalProbe = New-AzApplicationGatewayProbeConfig -Name "apimportalprobe" `
      -Protocol "Https" -HostName $portalHostname -Path "/signin" `
      -Interval 60 -Timeout 300 -UnhealthyThreshold 8
    
    $apimManagementProbe = New-AzApplicationGatewayProbeConfig -Name "apimmanagementprobe" `
      -Protocol "Https" -HostName $managementHostname -Path "/ServiceStatus" `
      -Interval 60 -Timeout 300 -UnhealthyThreshold 8
    
  7. 백 엔드 인증서의 신뢰할 수 있는 루트 인증서를 구성합니다. 이 인증서는 백 엔드 인증서의 신뢰성을 확인합니다.

    $trustedRootCert = New-AzApplicationGatewayTrustedRootCertificate `
      -Name "allowlistcert1" -CertificateFile $trustedRootCertCerPath
    
  8. 백 엔드 요청이 취소되기까지의 제한 시간을 포함하여 애플리케이션 게이트웨이에 대한 HTTP 백 엔드 설정을 구성합니다. 이 값은 프로브 제한 시간과 다릅니다.

    $apimPoolGatewaySetting = New-AzApplicationGatewayBackendHttpSettings -Name "apimPoolGatewaySetting" `
      -Port 443 -Protocol "Https" -CookieBasedAffinity "Disabled" -Probe $apimGatewayProbe `
      -TrustedRootCertificate $trustedRootCert -PickHostNameFromBackendAddress -RequestTimeout 180
    
    $apimPoolPortalSetting = New-AzApplicationGatewayBackendHttpSettings -Name "apimPoolPortalSetting" `
      -Port 443 -Protocol "Https" -CookieBasedAffinity "Disabled" -Probe $apimPortalProbe `
      -TrustedRootCertificate $trustedRootCert -PickHostNameFromBackendAddress -RequestTimeout 180
    
    $apimPoolManagementSetting = New-AzApplicationGatewayBackendHttpSettings -Name "apimPoolManagementSetting" `
      -Port 443 -Protocol "Https" -CookieBasedAffinity "Disabled" -Probe $apimManagementProbe `
      -TrustedRootCertificate $trustedRootCert -PickHostNameFromBackendAddress -RequestTimeout 180
    
  9. 각 API Management 엔드포인트에 대해 해당 도메인 이름을 사용하여 백 엔드 IP 주소 풀을 구성합니다.

    $apimGatewayBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "gatewaybackend" `
      -BackendFqdns $gatewayHostname
    
    $apimPortalBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "portalbackend" `
      -BackendFqdns $portalHostname
    
    $apimManagementBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "managementbackend" `
      -BackendFqdns $managementHostname
    
  10. 기본 라우팅을 사용하도록 애플리케이션 게이트웨이에 대한 라우팅 규칙을 만듭니다.

    # Public/external gateway rules
    $gatewayRule = New-AzApplicationGatewayRequestRoutingRule -Name "gatewayrule" `
      -RuleType Basic -HttpListener $gatewayListener -BackendAddressPool $apimGatewayBackendPool `
      -BackendHttpSettings $apimPoolGatewaySetting -Priority 10
    
    $portalRule = New-AzApplicationGatewayRequestRoutingRule -Name "portalrule" `
      -RuleType Basic -HttpListener $portalListener -BackendAddressPool $apimPortalBackendPool `
      -BackendHttpSettings $apimPoolPortalSetting -Priority 20
    
    $managementRule = New-AzApplicationGatewayRequestRoutingRule -Name "managementrule" `
      -RuleType Basic -HttpListener $managementListener -BackendAddressPool $apimManagementBackendPool `
      -BackendHttpSettings $apimPoolManagementSetting -Priority 30
    
    # Private/internal gateway rules
    $gatewayRulePrivate = New-AzApplicationGatewayRequestRoutingRule -Name "gatewayrule-private" `
      -RuleType Basic -HttpListener $gatewayListenerPrivate -BackendAddressPool $apimGatewayBackendPool `
      -BackendHttpSettings $apimPoolGatewaySetting -Priority 11
    
    $portalRulePrivate = New-AzApplicationGatewayRequestRoutingRule -Name "portalrule-private" `
      -RuleType Basic -HttpListener $portalListenerPrivate -BackendAddressPool $apimPortalBackendPool `
      -BackendHttpSettings $apimPoolPortalSetting -Priority 21
    
    $managementRulePrivate = New-AzApplicationGatewayRequestRoutingRule -Name "managementrule-private" `
      -RuleType Basic -HttpListener $managementListenerPrivate -BackendAddressPool $apimManagementBackendPool `
      -BackendHttpSettings $apimPoolManagementSetting -Priority 31
    

    -RuleType 및 라우팅을 변경하여 개발자 포털의 특정 페이지에 대한 액세스를 제한합니다.

  11. 애플리케이션 게이트웨이에 대한 크기 및 인스턴스 수를 구성합니다. 이 예제에서는 WAF_v2 SKU를 사용하여 API Management 리소스의 보안을 강화합니다.

    프로덕션 워크로드에 최소 두 개의 인스턴스(용량)를 사용합니다. 비프로덕션 시나리오 또는 일반 실험에 하나의 인스턴스만 사용할 수 있습니다. 자세한 내용은 Azure Application Gateway 가격 책정을 참조하세요.

    $sku = New-AzApplicationGatewaySku -Name "WAF_v2" -Tier "WAF_v2" -Capacity 2
    
  12. WAF 모드를 구성합니다.

    방화벽 규칙을 설치 및 테스트하는 동안 짧은 기간 동안 위협 경고를 모니터링하고 기록하지만 트래픽을 차단하지 않는 "검색" 모드를 구성할 수 있습니다. 그런 다음, 규칙이 감지하는 침입 및 공격을 차단하는 "방지" 모드로 전환하기 전에 방화벽 규칙을 업데이트할 수 있습니다.

    $config = New-AzApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode "Prevention"
    
  13. 현재 TLS 1.0이 기본값이므로 최근 TLS 1.2 정책 중 하나를 사용하도록 애플리케이션 게이트웨이를 설정합니다.

    $policy = New-AzApplicationGatewaySslPolicy -PolicyType Predefined -PolicyName AppGwSslPolicy20220101
    

애플리케이션 게이트웨이 만들기

  1. 이전 단계의 모든 구성 개체를 사용하여 애플리케이션 게이트웨이를 만듭니다. 인스턴스를 만드는 데 15분이 걸릴 수 있습니다.

    $appgw = New-AzApplicationGateway `
      -Name $appgwName `
      -ResourceGroupName $resGroupName `
      -Location $location `
      -Sku $sku `
      -SslPolicy $policy `
      -SslCertificates $certGateway, $certPortal, $certManagement `
      -TrustedRootCertificate $trustedRootCert `
      -BackendAddressPools $apimGatewayBackendPool, $apimPortalBackendPool, $apimManagementBackendPool `
      -BackendHttpSettingsCollection $apimPoolGatewaySetting, $apimPoolPortalSetting, $apimPoolManagementSetting `
      -GatewayIpConfigurations $gipconfig `
      -FrontendIpConfigurations $fipconfig01, $fipconfig02 `
      -FrontendPorts $fp01 `
      -HttpListeners $gatewayListener, $portalListener, $managementListener, $gatewayListenerPrivate, $portalListenerPrivate, $managementListenerPrivate `
      -RequestRoutingRules $gatewayRule, $portalRule, $managementRule, $gatewayRulePrivate, $portalRulePrivate, $managementRulePrivate `
      -Probes $apimGatewayProbe, $apimPortalProbe, $apimManagementProbe `
      -WebApplicationFirewallConfig $config
    
  2. API Management 백 엔드의 상태를 확인합니다.

    Get-AzApplicationGatewayBackendHealth -Name $appgwName -ResourceGroupName $resGroupName
    

각 백 엔드 풀의 상태가 정상인지 확인합니다. 비정상 백 엔드 또는 알 수 없는 상태의 백 엔드 문제를 해결해야 하는 경우 Application Gateway 백 엔드 상태 문제 해결을 참조하세요.

인터넷에서 API Management 엔드포인트에 액세스하는 DNS 레코드 만들기

애플리케이션 게이트웨이를 만든 후 인터넷에서 API Management에 대한 통신을 구성합니다. 구성한 각 API Management 엔드포인트 호스트 이름을 애플리케이션 게이트웨이의 고정 공용 IP 주소에 매핑하는 DNS A 레코드를 만듭니다. 이 문서에서 예시 호스트 이름은 api.contoso.net, portal.contoso.netmanagement.contoso.net입니다.

연결 확인

빠른 테스트를 위해 애플리케이션 게이트웨이의 공용 IP 주소를 API Management 엔드포인트 호스트 이름에 매핑하는 항목으로 사용자 컴퓨터의 호스트 파일을 일시적으로 수정하는 것을 고려합니다.

  1. 호스트 파일을 수정합니다. 예를 들어, 애플리케이션 게이트웨이의 공용 IP가 172.203.129.101인 경우 항목이 172.203.129.101 api.contoso.net일 수 있습니다.
  2. API Management의 상태 엔드포인트(이전 상태 프로브에 사용된 것과 동일한 경로)에 대해 curl 명령을 실행합니다. curl -v https://api.contoso.net/status-0123456789abcdef Application Gateway를 통해 API Management로의 통신에 성공했음을 나타내는 200 Service Operational 상태를 반환해야 합니다.

DNS 고려 사항

이제 Application Gateway에는 프라이빗 및 퍼블릭 경로가 있습니다. 동일한 도메인 및 포트를 사용하면 외부 DNS 확인자를 설정하여 애플리케이션 게이트웨이의 외부 IP 주소에 대한 api.contoso.net을(를) 확인해야 하는 반면, 내부 DNS 확인자는 애플리케이션 게이트웨이의 내부 IP 주소와 동일한 도메인을 확인해야 하는 스플릿 브레인(Split-Brain) DNS 상황이 만들어집니다. 이 설정은 애플리케이션이 애플리케이션 및 API의 내부 또는 외부 대상 지정을 위해 도메인 또는 포트를 변경할 필요가 없다는 장점을 제공합니다. 대상 지정에 대한 책임은 DNS 확인자를 적절하게 따릅니다.

요약

가상 네트워크에서 구성된 API Management는 온-프레미스 또는 클라우드에서 호스트되었는지 여부에 상관 없이 구성된 모든 API에 대한 단일 게이트웨이 인터페이스를 제공합니다. Application Gateway를 API Management와 통합하면 인터넷에서 특정 API에 선택적으로 액세스할 수 있는 유연성을 제공합니다. 통합은 또한 WAF를 API Management 인스턴스의 프런트 엔드로 제공합니다.

다음 단계