在內部虛擬網路中整合 API 管理與應用程式閘道

適用於:開發人員 |進階版

您可以在虛擬網路中以內部模式設定 API 管理服務,以僅供虛擬網路內存取。 Azure 應用程式閘道是平台即服務 (PaaS),作為第 7 層負載平衡器。 此為反向 Proxy 服務,在其供應項目中提供 Azure Web 應用程式防火牆 (WAF)。

結合內部虛擬網路中佈建的 API 管理與應用程式閘道前端,您可以:

  • 使用相同的 API 管理資源供內部取用者和外部取用者取用。
  • 使用單一 API 管理資源,並在 API 管理中定義一部分 API 供外部取用者使用。
  • 提供完整方法來啟用和停用從公用網際網路存取 API 管理。

如需架構指引,請參閱:

注意

本文已更新為使用應用程式閘道 WAF_v2 SKU

必要條件

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 請參閱安裝 Azure PowerShell 以開始使用。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

若要執行本文所述的步驟,您必須具有:

  • 有效的 Azure 訂用帳戶

    如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

  • 憑證

    • API 管理 自定義主機名的個人資訊交換 (PFX) 檔案:閘道、開發人員入口網站和管理端點。
    • PFX 憑證跟證書的憑證 (CER) 檔案。

    如需詳細資訊,請參閱後端的憑證。 基於測試用途,可選擇產生自我簽署憑證

  • 最新版本的 Azure PowerShell

案例

在本文中,您將了解如何對內部和外部取用者使用單一 API 管理執行個體,並作為內部部署和雲端 API 的單一前端。 您會建立較新單一租用戶版本 2 (stv2) 類型的 APIM 執行個體。 您將瞭解如何在 應用程式閘道 中使用公用和私人接聽程式。 您瞭解如何使用 應用程式閘道 中提供的路由功能,只公開一部分 API 以供外部取用。 在範例中,API 以綠色醒目提示。

在第一個設定範例中,只從虛擬網路內管理所有 API。 內部取用者可以存取所有內部和外部 API。 流量永遠不外流至網際網路。 透過 Azure ExpressRoute 線路可實現高效能連線能力。 在範例中,內部取用者以橙色醒目提示。

顯示 URL 路由的圖表。

整合 API 管理 和 應用程式閘道 需要什麼?

  • 後端伺服器集區︰此伺服器集區是 API 管理的內部虛擬 IP 位址。
  • 後端伺服器集區設定:每個集區都包括一些設定,例如連接埠、通訊協定和 Cookie 親和性。 這些設定會套用至集區內所有伺服器。
  • 前端連接埠:應用程式閘道上開放此公用連接埠。 到達的流量會重新導向其中一個後端伺服器。
  • 接聽程式:接聽程式具有前埠、通訊協定(Http 或 Https、這些值區分大小寫),以及傳輸層安全性 (TLS) 憑證名稱(如果設定 TLS 卸除)。
  • 規則︰規則將接聽程式繫結至後端伺服器集區。
  • 自訂健全狀態探查︰應用程式閘道預設使用 IP 位址型探查,找出 BackendAddressPool 中有哪些伺服器在作用中。 API 管理只回應具有正確主機標頭的要求,因此預設探查會失敗。 您定義自訂健全狀態探查,以協助應用程式閘道判斷服務在運作中而應該轉送要求。
  • 自定義網域憑證:若要從因特網存取 API 管理,請建立域名系統 (DNS) 記錄,將其主機名對應至 應用程式閘道 前端IP位址。 此對應會確保傳送到 API 管理的主機標頭和憑證為有效。 在此範例中,我們會使用三個憑證。 分別用於 API 管理的閘道 (後端)、開發人員入口網站和管理端點。

透過外部閘道將開發人員入口網站和管理端點對外公開

在本文中,我們也透過應用程式閘道,將「開發人員入口網站」和「管理端點」公開給外部對象。 建立每個端點的接聽程式、探查、設定和規則需要額外的步驟。 所有詳細資料在其各自的步驟中提供。

如果您使用 Microsoft Entra ID 或第三方驗證,則在應用程式閘道中啟用 Cookie 型工作階段親和性功能。

警告

在開發人員入口網站中下載 OpenAPI 規格時,為了防止應用程式閘道 WAF 中斷下載,請停用防火牆規則 942200 - "Detects MySQL comment-/space-obfuscated injections and backtick termination"

可能中斷入口網站功能的應用程式閘道 WAF 規則包括:

  • 920300920330931130942100942110942180942200942260942340942370,適用於系統管理模式
  • 942200942260942370942430942440,適用於發佈的入口網站

設定變數

在整個本指南中,您必須定義數個變數。 命名會以雲端採用架構縮寫指引為基礎。

# 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

建立資源管理員的資源群組

若要建立 Azure Resource Manager 的資源群組:

  1. 登入Azure。

    Connect-AzAccount
    
  2. 使用您的認證進行驗證。

  3. 選取您要的訂用帳戶。

    Get-AzSubscription -Subscriptionid $subscriptionId | Select-AzSubscription
    
  4. 建立資源群組。 如果您使用現有的資源群組,則可略過此步驟。

    New-AzResourceGroup -Name $resGroupName -Location $location
    

在資源管理員中,所有資源群組都需要指定位置。 此位置會作為該資源群組中之資源的預設位置。 請確定所有用來建立應用程式閘道的命令都使用同一個資源群組。

建立應用程式閘道的虛擬網路和子網路

下面的範例說明如何使用資源管理員建立虛擬網路。 此範例中的虛擬網路由應用程式閘道和 API 管理的個別子網路組成。

  1. 設定 應用程式閘道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. 為應用程式閘道子網路建立網路安全性群組 (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. 為 APIM 子網路建立網路安全性群組 (NSG) 和 NSG 規則。 APIM 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 指派給子網路變數,供您建立虛擬網路時用於應用程式閘道。

    $appGatewaySubnet = New-AzVirtualNetworkSubnetConfig -Name "appGatewaySubnet" -NetworkSecurityGroup $appGwNsg -AddressPrefix "10.0.0.0/24"
    
  5. 將位址範圍 10.0.1.0/24 指派給子網路變數,供您建立虛擬網路時用於 API 管理。

    $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 管理執行個體

以下示範如何在設定為僅供內部存取的虛擬網路中,建立 API 管理執行個體。

  1. API 管理 stv2 需要具有唯DomainNameLabel一 的公用IP。

    $apimPublicIpAddressId = New-AzPublicIpAddress -ResourceGroupName $resGroupName -name "pip-apim" -location $location `
        -AllocationMethod Static -Sku Standard -Force -DomainNameLabel $apimDomainNameLabel
    
  2. 使用您建立的子網路 $apimSubnetData,建立 API 管理虛擬網路物件。

    $apimVirtualNetwork = New-AzApiManagementVirtualNetwork -SubnetResourceId $apimSubnetData.Id
    
  3. 在虛擬網路內建立 API 管理執行個體。 此範例在開發人員服務層級建立服務。 以唯一名稱替換 API 管理執行個體。

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

在此階層建立和啟用 API 管理執行個體可能需要 30 到 40 分鐘。 在上一個命令成功之後,請參閱存取內部虛擬網路 API 管理服務所需的 DNS 設定,以確認可存取。

在 API 管理中設定自訂網域名稱

若要在 API 管理中設定自訂網域名稱:

  1. 使用網域和受信任根憑證的憑證和私密金鑰詳細資料,初始化下列變數。 在此範例中,我們使用 api.contoso.netportal.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 管理端點的 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. 建立自訂網域主機名稱的 A 記錄,以對應至 API 管理的私人 IP 位址。

    $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)
    

建立應用程式閘道組態

建立應用程式閘道之前,必須先設定所有組態項目。 下列步驟建立應用程式閘道資源所需的組態項目。

  1. 建立名為 gatewayIP01 的應用程式閘道 IP 組態。 當「應用程式閘道」啟動時,它會從已設定的子網路取得 IP 位址,再將網路流量路由傳送到後端 IP 集區中的 IP 位址。 請記住,每個執行個體需要一個 IP 位址。

    $gipconfig = New-AzApplicationGatewayIPConfiguration -Name "gatewayIP01" -Subnet $appGatewaySubnetData
    
  2. 為公用和私人IP端點設定相同的前端埠。 使用者會連線至此連接埠。 藉由針對兩者使用相同的埠,我們可確保可以對相同的埠提出內部和外部要求。

    $fp01 = New-AzApplicationGatewayFrontendPort -Name "port01"  -Port 443
    
  3. 設定兩個前端IP位址 - 一個公用和一個私用。 私人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. 設定應用程式閘道的憑證。 用於解密和重新加密通過的流量。

    注意

    應用程式閘道支援定義自訂 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 管理 ContosoApi 閘道網域端點建立自訂探查。 路徑 /status-0123456789abcdef 是 API 管理的所有執行個體上裝載的預設健康情況端點。 將 api.contoso.net 設定為自訂探查主機名稱,以利用 TLS/SSL 憑證加以保護。

    注意

    主機名稱 contosoapi.azure-api.net 是在公用 Azure 中建立名為 contosoapi 的服務時,所設定的預設 Proxy 主機名稱。

    $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 管理 端點設定後端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 管理資源的安全性。

    對於生產工作負載,請至少使用兩個執行個體 (「容量」)。 針對非生產情節或一般實驗,可能只需要使用一個執行個體。 如需詳細資訊,請參閱 Azure 應用程式閘道定價

    $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 管理 後端的健康狀態。

    Get-AzApplicationGatewayBackendHealth -Name $appgwName -ResourceGroupName $resGroupName
    

確定每個後端集區的健全狀態為「良好」。 如需針對狀況不良的後端或健全狀態未知的後端進行疑難排解,請參閱在應用程式閘道中針對後端健康情況問題進行疑難排解

建立 DNS 記錄以從網際網路存取 API 管理端點

建立應用程式閘道之後,請設定從因特網 API 管理 的通訊。 建立 DNS A 記錄,其對應您設定為應用程式閘道靜態公用 IP 位址的每個 API 管理端點主機名稱。 在本文中,範例主機名稱為 api.contoso.netportal.contoso.netmanagement.contoso.net

連線 驗證

為了快速測試,請考慮暫時修改計算機的主機檔案,並將應用程式閘道的公用IP位址對應至 API 管理端點主機名的專案:

  1. 修改主機檔案。 例如,如果應用程式閘道的公用IP是 172.203.129.101,則專案可能是 172.203.129.101 api.contoso.net
  2. 針對 API 管理 的狀態端點執行 curl 命令(先前用於健康狀態探查的路徑相同):curl -v https://api.contoso.net/status-0123456789abcdef這應該會傳回200 Service Operational狀態,這表示透過 應用程式閘道 成功與 API 管理 通訊。

DNS 考慮

應用程式閘道 現在有私人和公共途徑。 使用相同的網域和埠會建立分割腦 DNS 情況,其中外部 DNS 解析程式應設定為解析為應用程式閘道的外部 IP 位址,而內部 DNS 解析程式應將相同的網域解析 api.contoso.net 為應用程式閘道的內部 IP 位址。 此設定的優點在於,應用程式不需要改變網域或埠,以取得應用程式和API的內部或外部目標。 目標的責任會適當地延後至 DNS 解析程式。

摘要

針對所有設定的 API,不論裝載於內部或雲端,虛擬網路中設定的 API 管理提供單一閘道介面。 整合應用程式閘道與 API 管理讓您有彈性選擇開放特定 API 供網際網路存取。 整合也提供 WAF 作為 API 管理執行個體的前端。

下一步