Назад | Перейти на главную страницу

Ограничение скорости с использованием шлюза приложений Azure

Я изменяю развертывание нашего веб-приложения со службы приложений Azure на виртуальные машины за шлюзом приложений, поскольку служба приложений не смогла справиться с пиковой нагрузкой, которая была у нас несколько дней назад.

Что я сейчас хотел бы сделать, чтобы защитить приложение от возможного очень короткого пикового использования, так это реализовать ограничение скорости (например, максимум 60 запросов в минуту на клиент / IP).

Ожидается, что у приложения будет очень короткий пик использования (приложение для продажи билетов и начало продажи очень популярного мероприятия).
В прошлый раз, когда случился пик, и сервер стал медленнее, люди начали нажимать «Обновить» так быстро, как могли, и полностью выключили всю систему без возможности восстановления (при нескольких тысячах запросов в секунду наша система не могла запуститься опять же, поскольку он на самом деле не рассчитан на такую ​​высокую нагрузку, так как в 99.9% случаев мы получаем <100 запросов в секунду) - поэтому мы хотели бы иметь возможность избежать таких пользователей, "DDoS-атакующих" систему " случайно или из-за страха не получить свой билет "...

Возможно ли это с помощью шлюза приложений?
Любая другая идея, как можно реализовать такое (по запросу) ограничение скорости?

Я обнаружил следующее: https://docs.microsoft.com/en-us/azure/api-management/api-management-sample-f 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 Management, платформы, специально предназначенной для создания и предоставления сложных платформ API. Хотя с помощью этой службы вы можете реализовать ряд вариантов манипулирования трафиком, в данном случае это, вероятно, не то, что вы ищете, поскольку она предназначена как более комплексная платформа управления корпоративным API с целым рядом возможностей, которые вы не сможете необходимость.

ОБНОВЛЕНО: хотя мне было легко добавить некоторые URL-адреса, на самом деле не очень хорошо задокументировано, как применить политику к входной двери Azure, чтобы делать то, чего вы хотите достичь.

Итак, вот несколько шагов в PowerShell, которые помогут ему - обратите внимание, что это может быть не совсем то, что вам нужно, но оно должно помочь вам начать (с использованием нового модуля Az.Frontdoor):

Сначала мы создаем условие соответствия, здесь я сопоставляю любой IP-адрес (хотя вы можете создать определенные условия для диапазона IP-адресов, если хотите):

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

Затем мы создаем настраиваемое правило ограничения скорости, которое будет соответствовать любому условию совпадения, и если оно увидит более 10 запросов в течение 1 минуты, которые соответствуют этому условию, оно заблокирует их на 1 минуту (I считать - это очень новая услуга, и документация не очень понятна, это то, что я нашел в результате некоторых экспериментов):

$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 (замените TestRG и TestFD своими именами группы ресурсов и экземпляра Front Door соответственно):

$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