Azure

使用 Azure 應用程序網關的速率限制

  • March 7, 2022

我正在將我們的 Web 應用程序的部署從 Azure 應用程序服務更改為應用程序網關後面的虛擬機,因為應用程序服務無法處理我們幾天前的峰值負載。

為了保護應用程序免受可能的非常短的峰值使用,我現在想做的是實施速率限制(例如,每個客戶端/IP 每分鐘最多 60 個請求)。

該應用程序預計將有一個非常短的峰值使用(售票應用程序並開始銷售一個非常受歡迎的活動)。

上次出現峰值並且伺服器變慢時,人們開始盡可能快地點擊“刷新”並完全關閉整個系統而沒有機會恢復(每秒有數千個請求,我們的系統無法啟動再次,因為它並不是真正為如此高的負載而設計的,因為在 99.9% 的時間內我們每秒有 <100 個請求) - 所以我們希望有可能避免此類使用者“DDoS-ing”系統“出於意外或害怕沒有得到他們的票”……

這可以使用應用程序網關嗎?

任何其他想法如何實現這種(按需)速率限制?

我發現如下:https ://docs.microsoft.com/en-us/azure/api-management/api-management-sample-flexible-throttling 但這似乎不適用於應用程序網關,或者至少我做到了不知道怎麼…

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

接下來我們創建一個自定義速率限制規則,這將匹配任何匹配條件,如果它在 1 分鐘內看到超過 10 個滿足該條件的請求,它將阻止它們 1 分鐘(我認為- 這是一個非常新服務和文件不是很清楚,這是我從一些實驗中發現的):

$cr = New-AzFrontDoorCustomRuleObject -Name MyRule1 -RuleType RateLimitRule -MatchCondition $mc -Action Block -RateLimitThreshold 10 -RateLimitDurationInMinutes 1 -Priority 10

然後我們只使用我們的單個自定義規則創建一個 WAF 策略:

$policy = New-AzFrontDoorFireWallPolicy -ResourceGroupName AD -Name MyPolicy -Customrule $cr -EnabledState Enabled -Mode Prevention

然後我們將它附加到我們的 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]

希望這可以幫助您入門,正如我所說,實際上如何執行速率限制似乎有點不清楚。如果我找到我們的更多詳細資訊 - 或者其他人有它們,我很樂意再次更新答案。

我用來建構它的參考是 Az.Frontdoor 文件:

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

引用自:https://serverfault.com/questions/961678