web-dev-qa-db-ja.com

Azure Application Gatewayを使用したレート制限

App Serviceは数日前のピーク負荷を処理できなかったため、Web AppのデプロイをAzure App ServiceからApplication Gatewayの背後のVMに変更しています。

考えられる非常に短いピーク使用量からアプリを保護するために今私がしたいことは、レート制限を実装することです(たとえば、クライアント/ IPごとに1分あたり最大60リクエスト)。

アプリのピーク使用量は非常に短いと予想されます(チケット販売アプリで、非常に人気のあるイベントの販売を開始します)。
最後にピークが発生し、サーバーの速度が低下した最後の時間に、人々はできる限り速く「更新」を開始し、回復する機会なしにシステム全体を完全にシャットダウンしました(1秒あたり数千の要求で、システムは99.9%の場合、1秒あたりのリクエスト数が100未満であるなど、実際にはそれほど負荷が高くないように設計されていないため、再起動できません)。 「偶然または恐怖のためにチケットを取得できなかった」システムを使用している...

これはアプリケーションゲートウェイを使用して可能ですか?
そのような(オンデマンドの)レート制限をどのように実装できるか、他に何か考えはありますか?

私が見つけたものは次のとおりです: https://docs.Microsoft.com/en-us/Azure/api-management/api-management-sample-flexible-throttling しかし、これは当てはまらないようですアプリケーションゲートウェイまたは少なくとも方法がわかりませんでした...

1
Christoph Fink

レート制限を適用するためのAzure Application Gateway内のネイティブメカニズムはありません。

おそらく最も簡単なのは、Azureフロントドアサービスを確認することです。

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 Application Gatewayを使用することはお勧めしません。フロントドアの機能を複製し、ベーシックAzureロードバランサーにはないコストがかかるためです。

また、仮想マシンスケールセット(VMSS)を確認し、それをメカニズムとして使用して、需要に基づいて自動スケーリングすることもお勧めします。これにより、(更新ボタンの妨害による)個々のクライアントIPのレートを制限しながら、正当なクライアントのボリュームに基づいてアプリケーションをスケーリングし、コストを節約するために後で再度スケールダウンすることができます。見る:

https://docs.Microsoft.com/en-us/Azure/virtual-machine-scale-sets/overview

最後に、参照するリンクはAzure API Managementの一部です。これは、複雑なAPIプラットフォームを構築および公開するためのプラットフォームです。そのサービスを使用してさまざまなトラフィック操作オプションを実現できますが、これは、このケースでは探しているものではない可能性があります。これは、幅広い機能を備えた、より包括的なエンタープライズAPI管理プラットフォームを対象としているためです。必要。

更新:一部のURLを簡単にスローできるようになりましたが、実際にポリシーをAzure Front Doorに適用して目的のことを実行する方法は十分に文書化されていません。

それでは、PowerShellでいくつかの手順を実行してみます。これは、希望どおりではないかもしれませんが、(新しいAz.Frontdoorモジュールを使用して)開始できるはずです。

最初に一致条件を作成します。ここでは任意のIPアドレスを一致させています(必要に応じてIP範囲固有の条件を作成することもできます)。

$mc = New-AzFrontDoorMatchConditionObject -MatchVariable RemoteAddr -OperatorProperty Any

次に、カスタムレート制限ルールを作成します。これは、任意の一致条件に一致するものを取得し、1分間にその条件を満たす10を超えるリクエストを検出した場合、1分間それらをブロックします(Ithink-これは非常に新しいサービスであり、ドキュメントは非常に明確ではありません。これは私がいくつかの実験から見つけたものです):

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

次に、1つのカスタムルールだけを使用してWAFポリシーを作成します。

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

次に、それをフロントドアインスタンスに接続します(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.

4
Alex Moore