Я изменяю развертывание нашего веб-приложения со службы приложений 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