使用 Azure 应用程序网关的速率限制

Chr*_*ink 2 web-applications load-balancing azure rate-limiting azure-networking

我正在将我们的 Web 应用程序的部署从 Azure 应用程序服务更改为应用程序网关后面的 VM,因为应用程序服务无法处理我们几天前的峰值负载。

我现在想要做的是保护应用程序免受可能的非常短的高峰使用的影响是实现速率限制(例如,每个客户端/IP 每分钟最多 60 个请求)。

预计该应用程序的使用高峰期非常短(售票应用程序并开始销售非常受欢迎的活动)。
上次出现峰值并且服务器变慢时,人们开始尽可能快地点击“刷新”并完全关闭整个系统而没有机会恢复(每秒有数千个请求,我们的系统无法启动再次,因为它并不是真正为如此高的负载而设计的,因为在 99.9% 的时间里,我们每秒有 <100 个请求) - 所以我们希望有可能避免此类用户对系统进行“DDoS”攻击”意外或因为害怕没有拿到他们的票”...

这可以使用应用程序网关吗?
任何其他想法如何实现这种(按需)速率限制?

我发现如下:https://docs.microsoft.com/en-us/azure/api-management/api-management-sample-flexible-throttling 但这似乎不适用于应用程序网关,或者至少我做到了不知道怎么...

Ale*_*ore 6

Azure 应用程序网关中没有应用速率限制的本机机制。

可能最简单的方法是查看 Azure Front Door 服务:

https://docs.microsoft.com/en-us/azure/frontdoor/front-door-overview

特别是客户端速率限制 WAF 规则:

https://docs.microsoft.com/en-us/azure/frontdoor/waf-overview#waf-rules

请注意,这将限制基于特定客户端 IP 的速率限制,如果您有一系列客户端,它不一定对您有帮助。

请注意,FrontDoor 的后端池可以是任何主机名,因此它可以是一组虚拟机,或者您可以拥有一个简单的 Azure 负载均衡器,您可以将其用作端点。尽管我不建议在此设置中使用 Azure 应用程序网关,因为它会复制 Front Door 中的功能,并且成本是基本 Azure 负载均衡器所没有的。

我的建议还包括查看虚拟机规模集 (VMSS) 并将其用作一种机制,以根据需求自动扩展。通过这种方式,您可以对单个客户端 IP 进行速率限制(来自刷新按钮阻塞),还可以根据合法的客户端数量扩展您的应用程序 - 之后再次缩减以节省成本。看:

https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/overview

最后,您引用的链接是 Azure API 管理的一部分,这是一个专门用于构建和公开复杂 API 平台的平台。虽然您可以使用该服务实现一系列流量操纵选项,但在这种情况下,它可能不是您想要的,因为它是一个更全面的企业 API 管理平台,具有您不会拥有的一系列功能需要。

更新:虽然我很容易输入一些 URL,但实际上并没有很好地记录如何将策略应用到 Azure Front Door 来完成你想要实现的目标。

所以这里有一些 PowerShell 中的步骤可以帮助它 - 请注意它可能不是你想要的,但它应该让你开始(使用新的 Az.Frontdoor 模块):

首先,我们创建一个匹配条件,在这里我匹配任何 IP 地址(尽管您可以根据需要构建 IP 范围特定条件):

$mc = New-AzFrontDoorMatchConditionObject -MatchVariable RemoteAddr -OperatorProperty Any
Run Code Online (Sandbox Code Playgroud)

接下来我们创建一个自定义速率限制规则,这将匹配任何匹配条件,如果在 1 分钟内看到超过 10 个满足该条件的请求,它将阻止它们 1 分钟(我认为- 这是一个非常新服务和文档不是很清楚,这是我从一些实验中发现的):

$cr = New-AzFrontDoorCustomRuleObject -Name MyRule1 -RuleType RateLimitRule -MatchCondition $mc -Action Block -RateLimitThreshold 10 -RateLimitDurationInMinutes 1 -Priority 10
Run Code Online (Sandbox Code Playgroud)

然后我们仅使用我们的单个自定义规则创建 WAF 策略:

$policy = New-AzFrontDoorFireWallPolicy -ResourceGroupName AD -Name MyPolicy -Customrule $cr -EnabledState Enabled -Mode Prevention
Run Code Online (Sandbox Code Playgroud)

然后我们将它附加到我们的 Front Door 实例(分别用您的资源组和 Front Door 实例的名称替换 TestRG 和 TestFD):

$fd = Get-AzFrontDoor -ResourceGroupName TestRG -Name TestFD
$fd[0].FrontendEndpoints[0].WebApplicationFirewallPolicyLink = $policy.Id
Set-AzFrontDoor -InputObject $fd[0]
Run Code Online (Sandbox Code Playgroud)

希望能帮助您入门,正如我所说,似乎有点不清楚速率限制是如何实际执行的。如果我找到我们的更多详细信息 - 或者其他人拥有它们,我很乐意再次更新答案。

我用来构建它的参考是 Az.Frontdoor 文档:

https://docs.microsoft.com/en-us/powershell/module/az.frontdoor/?view=azps-1.6.0