在包含应用程序网关的内部 VNET 中集成 API 管理

概述

可在处于内部模式的虚拟网络中配置 API 管理服务,以便只能从该虚拟网络内部访问该服务。 Azure 应用程序网关是一个 PAAS 服务,提供第 7 层负载均衡器。 它充当反向代理服务,并提供 Web 应用程序防火墙 (WAF) 及其他产品/服务。

将内部 VNET 中预配的 API 管理与应用程序网关前端相结合可实现以下方案:

  • 使用同时供内部使用者和外部使用者使用的相同 API 管理资源。
  • 使用单个 API 管理资源,并向外部使用者提供在 API 管理中定义的一部分 API。
  • 提供配套的方式让客户启用和禁用通过公共 Internet 对 API 管理的访问。

方案

本文介绍如何对内部和外部使用者使用单个 API 管理服务,并使其充当本地和云 API 的单一前端。 另外,还介绍了如何使用应用程序网关中提供的 PathBasedRouting 功能,仅公开一部分 API(在示例中以绿色突出显示)供外部使用。

在第一个设置示例中,只能从虚拟网络内部管理所有 API。 内部使用者(以橙色突出显示)可以访问所有内部和外部 API。 流量永远不会外发到 Internet,并且可以通过 Express Route 线路提供较高的性能。

url 路由

开始之前

  1. 使用 Web 平台安装程序安装最新版本的 Azure PowerShell cmdlet。 可以从下载页的“Windows PowerShell”部分下载并安装最新版本。
  2. 创建一个虚拟网络,并为 API 管理和应用程序网关创建单独的子网。
  3. 如果想要为虚拟网络创建自定义 DNS 服务器,请在开始部署之前创建。 确保在虚拟网络中的新子网内创建的虚拟机可以解析和访问所有 Azure 服务终结点,使该服务器可正常工作。

在 API 管理与应用程序网关之间创建集成需要做好哪些准备?

  • 后端服务器池:API 管理服务的内部虚拟 IP 地址。
  • 后端服务器池设置: 每个池都有一些设置,例如端口、协议和基于 Cookie 的关联性。 这些设置将应用到池中的所有服务器。
  • 前端端口:此端口是应用程序网关上打开的公共端口。 抵达此端口的流量将重定向到后端服务器之一。
  • 侦听器:侦听器具有前端端口、协议(Http 或 Https,这些值区分大小写)和 SSL 证书名称(如果要配置 SSL 卸载)。
  • 规则:规则将侦听器绑定到后端服务器池。
  • 自定义运行状况探测:默认情况下,应用程序网关使用基于 IP 地址的探测来判断 BackendAddressPool 中的哪些服务器处于活动状态。 API 管理服务只响应包含正确主机标头的请求,因此默认的探测会失败。 需要定义一个自定义运行状况探测,帮助应用程序网关确定服务处于活动状态,应该转发该请求。
  • 自定义域证书:若要从 Internet 访问 API 管理,需要创建从服务主机名到应用程序网关前端 DNS 名称的 CNAME 映射。 这可以确保发送到应用程序网关,并转发到 API 管理的主机名标头和证书是 APIM 可以识别为有效的对象。

集成 API 管理和应用程序网关所需执行的步骤

  1. 创建 Resource Manager 的资源组。
  2. 创建应用程序网关的虚拟网络、子网和公共 IP。 为 API 管理创建另一个子网。
  3. 在前面创建的 VNET 子网中创建一个 API 管理服务,并确保使用“内部”模式。
  4. 在 API 管理服务中设置自定义域名。
  5. 创建应用程序网关配置对象。
  6. 创建应用程序网关资源。
  7. 创建从应用程序网关公共 DNS 名称到 API 管理代理主机名的 CNAME 映射

创建 Resource Manager 的资源组

确保使用最新版本的 Azure PowerShell。 将 Windows PowerShell 与 Resource Manager 配合使用中提供了详细信息。

步骤 1

登录 Azure

Login-AzureRmAccount -Environment $(Get-AzureRmEnvironment -Name AzureChinaCloud)

使用凭据进行身份验证。

步骤 2

检查该帐户的订阅并将它选中。

Get-AzureRmSubscription -Subscriptionid "GUID of subscription" | Select-AzureRmSubscription

步骤 3

创建资源组(如果要使用现有的资源组,请跳过此步骤)。

New-AzureRmResourceGroup -Name "apim-appGw-RG" -Location "China East"

Azure Resource Manager 要求所有资源组指定一个位置。 此位置将用作该资源组中的资源的默认位置。 请确保用于创建应用程序网关的所有命令都使用相同的资源组。

为应用程序网关创建虚拟网络和子网

以下示例演示如何使用 Resource Manager 创建虚拟网络。

步骤 1

将地址范围 10.0.0.0/24 分配到创建虚拟网络时用于应用程序网关的子网变量。

$appgatewaysubnet = New-AzureRmVirtualNetworkSubnetConfig -Name "apim01" -AddressPrefix "10.0.0.0/24"

步骤 2

将地址范围 10.0.1.0/24 分配到创建虚拟网络时用于 API 管理的子网变量。

$apimsubnet = New-AzureRmVirtualNetworkSubnetConfig -Name "apim02" -AddressPrefix "10.0.1.0/24"

步骤 3

将前缀 10.0.0.0/16 与子网 10.0.0.0/24 和 10.0.1.0/24 配合使用,在中国东部区域的 apim-appGw-RG 资源组中创建名为 appgwvnet 的虚拟网络。

$vnet = New-AzureRmVirtualNetwork -Name "appgwvnet" -ResourceGroupName "apim-appGw-RG" -Location "China East" -AddressPrefix "10.0.0.0/16" -Subnet $appgatewaysubnet,$apimsubnet

步骤 4

分配一个子网变量供后续步骤使用

$appgatewaysubnetdata=$vnet.Subnets[0]
$apimsubnetdata=$vnet.Subnets[1]

在以内部模式配置的 VNET 中创建 API 管理服务

以下示例演示如何在 VNET 中创建一个配置为仅供内部访问的 API 管理服务。

步骤 1

使用前面创建的子网 $apimsubnetdata 创建一个 API 管理虚拟网络对象。

$apimVirtualNetwork = New-AzureRmApiManagementVirtualNetwork -Location "China East" -SubnetResourceId $apimsubnetdata.Id

步骤 2

在虚拟网络中创建一个 API 管理服务。

$apimService = New-AzureRmApiManagement -ResourceGroupName "apim-appGw-RG" -Location "China East" -Name "ContosoApi" -Organization "Contoso" -AdminEmail "admin@contoso.com" -VirtualNetwork $apimVirtualNetwork -VpnType "Internal" -Sku "Developer"

上述命令成功后,请参阅访问内部 VNET API 管理服务所需完成的 DNS 配置访问该服务。

在 API 管理中设置自定义域名

步骤 1

上传包含域私钥的证书。 在本示例中,该域为 *.contoso.net

$certUploadResult = Import-AzureRmApiManagementHostnameCertificate -ResourceGroupName "apim-appGw-RG" -Name "ContosoApi" -HostnameType "Proxy" -PfxPath <full path to .pfx file> -PfxPassword <password for certificate file> -PassThru

步骤 2

上载证书后,可以使用主机名 api.contoso.net 为代理创建主机名配置对象,因为示例证书已提供对 *.contoso.net 域的权限。

$proxyHostnameConfig = New-AzureRmApiManagementHostnameConfiguration -CertificateThumbprint $certUploadResult.Thumbprint -Hostname "api.contoso.net"
$result = Set-AzureRmApiManagementHostnames -Name "ContosoApi" -ResourceGroupName "apim-appGw-RG" -ProxyHostnameConfiguration $proxyHostnameConfig

创建前端配置的公共 IP 地址

在中国东部区域的 apim-appGw-RG 资源组中创建公共 IP 资源 publicIP01

$publicip = New-AzureRmPublicIpAddress -ResourceGroupName "apim-appGw-RG" -name "publicIP01" -location "China East" -AllocationMethod Dynamic

服务启动时,会将一个 IP 地址分配到应用程序网关。

创建应用程序网关配置

在创建应用程序网关之前,必须设置所有配置项目。 以下步骤将创建应用程序网关资源所需的配置项。

步骤 1

创建名为“gatewayIP01” 的应用程序网关 IP 配置。 当应用程序网关启动时,它会从配置的子网获取 IP 地址,再将网络流量路由到后端 IP 池中的 IP 地址。 请记住,每个实例需要一个 IP 地址。

$gipconfig = New-AzureRmApplicationGatewayIPConfiguration -Name "gatewayIP01" -Subnet $appgatewaysubnetdata

步骤 2

配置公共 IP 终结点的前端 IP 端口。 此端口是最终用户连接到的端口。

$fp01 = New-AzureRmApplicationGatewayFrontendPort -Name "port01"  -Port 443

步骤 3

使用公共 IP 终结点配置前端 IP。

$fipconfig01 = New-AzureRmApplicationGatewayFrontendIPConfig -Name "frontend1" -PublicIPAddress $publicip

步骤 4

为应用程序网关配置用于解密和重新加密所传递流量的证书。

$cert = New-AzureRmApplicationGatewaySslCertificate -Name "cert01" -CertificateFile <full path to .pfx file> -Password <password for certificate file>

步骤 5

为应用程序网关创建 HTTP 侦听器。 将前端 IP 配置、端口和 SSL 证书分配到应用程序网关。

$listener = New-AzureRmApplicationGatewayHttpListener -Name "listener01" -Protocol "Https" -FrontendIPConfiguration $fipconfig01 -FrontendPort $fp01 -SslCertificate $cert

步骤 6

针对 API 管理服务的 ContosoApi 代理域终结点创建自定义探测。 路径 /status-0123456789abcdef 是所有 API 管理服务中托管的默认运行状况终结点。 将 api.contoso.net 设置为自定义探测主机名,以便使用 SSL 证书保护它。

Note

主机名 contosoapi.azure-api.cn 是在公共 Azure 中创建名为 contosoapi 的服务时配置的默认代理主机名。

$apimprobe = New-AzureRmApplicationGatewayProbeConfig -Name "apimproxyprobe" -Protocol "Https" -HostName "api.contoso.net" -Path "/status-0123456789abcdef" -Interval 30 -Timeout 120 -UnhealthyThreshold 8

步骤 7

上传要在已启用 SSL 的后端池资源上使用的证书。 该证书与你在上述步骤 4 中所提供的证书相同。

$authcert = New-AzureRmApplicationGatewayAuthenticationCertificate -Name "whitelistcert1" -CertificateFile <full path to .cer file>

步骤 8

为应用程序网关配置 HTTP 后端设置。 这包括设置后端请求的超时限制,超过该限制将取消请求。 此值不同于探测超时。

$apimPoolSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name "apimPoolSetting" -Port 443 -Protocol "Https" -CookieBasedAffinity "Disabled" -Probe $apimprobe -AuthenticationCertificates $authcert -RequestTimeout 180

步骤 9

使用前面创建的 API 管理服务的内部虚拟 IP 地址配置名为 apimbackend 的后端 IP 地址池。

$apimProxyBackendPool = New-AzureRmApplicationGatewayBackendAddressPool -Name "apimbackend" -BackendIPAddresses $apimService.StaticIPs[0]

步骤 10

创建虚拟(不存在)后端的设置。 对我们不想通过应用程序网关从 API 管理公开的 API 路径的请求,将会转向此后端,并返回 404。

配置虚拟后端的 HTTP 设置。

$dummyBackendSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name "dummySetting01" -Port 80 -Protocol Http -CookieBasedAffinity Disabled

配置虚拟后端“dummyBackendPool”,它指向 FQDN 地址“dummybackend.com”。虚拟网络中不存在此 FQDN 地址。

$dummyBackendPool = New-AzureRmApplicationGatewayBackendAddressPool -Name "dummyBackendPool" -BackendFqdns "dummybackend.com"

创建应用程序网关将默认使用的规则设置,用以指向虚拟网络中不存在的后端“dummybackend.com”。

$dummyPathRule = New-AzureRmApplicationGatewayPathRuleConfig -Name "nonexistentapis" -Paths "/*" -BackendAddressPool $dummyBackendPool -BackendHttpSettings $dummyBackendSetting

步骤 11

配置后端池的 URL 规则路径。 这样,便可以选择只向公众公开 API 管理中的一部分 API。 例如,如果存在 Echo API (/echo/)、Calculator API (/calc/) 等,可以仅将 Echo API 设置为可从 Internet 访问。

以下示例针对“/echo/”路径创建一个将流量路由到后端“apimProxyBackendPool”的简单规则。

$echoapiRule = New-AzureRmApplicationGatewayPathRuleConfig -Name "externalapis" -Paths "/echo/*" -BackendAddressPool $apimProxyBackendPool -BackendHttpSettings $apimPoolSetting

如果路径不符合我们希望从 API 管理中启用的路径规则,那么规则路径映射配置也会配置一个名为“dummyBackendPool”的默认后端地址池。 例如,http://api.contoso.net/calc/* 将转到 dummyBackendPool,因为它被定义为非匹配流量的默认池。

$urlPathMap = New-AzureRmApplicationGatewayUrlPathMapConfig -Name "urlpathmap" -PathRules $echoapiRule, $dummyPathRule -DefaultBackendAddressPool $dummyBackendPool -DefaultBackendHttpSettings $dummyBackendSetting

上述步骤可确保只允许针对路径“/echo/”发出的请求通过应用程序网关。 从 Internet 访问时,针对在 API 管理中配置的其他 API 发出的请求会在应用程序网关中引发 404 错误。

步骤 12

为应用程序网关创建规则设置,以使用基于 URL 路径的路由。

$rule01 = New-AzureRmApplicationGatewayRequestRoutingRule -Name "rule1" -RuleType PathBasedRouting -HttpListener $listener -UrlPathMap $urlPathMap

步骤 13

配置实例数目和应用程序网关的大小。 此处我们使用 WAF SKU 来提高 API 管理资源的安全性。

$sku = New-AzureRmApplicationGatewaySku -Name "WAF_Medium" -Tier "WAF" -Capacity 2

步骤 14

将 WAF 配置为“防护”模式。

$config = New-AzureRmApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode "Prevention"

创建应用程序网关

创建包含前述步骤中所有配置对象的应用程序网关。

$appgw = New-AzureRmApplicationGateway -Name $applicationGatewayName -ResourceGroupName $resourceGroupName  -Location $location -BackendAddressPools $apimProxyBackendPool, $dummyBackendPool -BackendHttpSettingsCollection $apimPoolSetting, $dummyBackendSetting  -FrontendIpConfigurations $fipconfig01 -GatewayIpConfigurations $gipconfig -FrontendPorts $fp01 -HttpListeners $listener -UrlPathMaps $urlPathMap -RequestRoutingRules $rule01 -Sku $sku -WebApplicationFirewallConfig $config -SslCertificates $cert -AuthenticationCertificates $authcert -Probes $apimprobe

创建从 API 管理代理主机名到应用程序网关资源公共 DNS 名称的 CNAME 映射

创建网关后,下一步是配置前端以进行通信。 使用公共 IP 时,应用程序网关需要动态分配的 DNS 名称,因此可能不容易使用。

应使用应用程序网关的 DNS 名称来创建 CNAME 记录,使 APIM 代理主机名(例如,上面示例中的 api.contoso.net)指向此 DNS 名称。 若要配置前端 IP CNAME 记录,可使用 PublicIPAddress 元素检索应用程序网关及其关联的 IP/DNS 名称的详细信息。 不建议使用 A 记录,因为重新启动网关后 VIP 可能会变化。

Get-AzureRmPublicIpAddress -ResourceGroupName "apim-appGw-RG" -Name "publicIP01"

摘要

VNET 中配置的 Azure API 管理为配置的所有 API 提供单个网关接口,无论这些 API 是托管在本地还是云中。 将应用程序网关与 API 管理集成可以灵活地、有选择性地允许从 Internet 上访问特定 API,以及向 API 管理实例提供 Web 应用程序防火墙作为前端。

后续步骤