#amazon-web-services #amazon-eks #amazon-ecr #aws-application-load-balancer
#amazon-веб-сервисы #amazon-eks #amazon-ecr #aws-приложение-балансировщик нагрузки
Вопрос:
Есть ли какой-либо способ ограничить количество пользователей, получающих доступ к URL-адресу сайта с помощью AWS? WAF проверяет наличие IP-адреса и блокирует его, если он превышает предельную скорость.
Мне нужно, чтобы он был с любого IP-адреса, и если он полностью превышает ограничение скорости, он должен перенаправить на пользовательскую страницу с сообщением о превышении лимита.
Регулирование скорости с помощью api gateway кажется лучшим способом, однако домашняя страница не вызывает никакого api. Таким образом, им нужно управлять только с помощью URL-адреса.
Комментарии:
1. Вы могли бы просто использовать Nginx перед вашим приложением. Их ограничение скорости действительно гибкое. Вы можете просто установить ключ ограничения скорости для URL-адреса, тогда он будет доступен глобально для этого URL-адреса, а не для каждого IP-адреса: nginx.com/blog/rate-limiting-nginx
2. Пробовал, хотя и не совсем стабильно. Также я использую EKS и его апатриды. В этом случае совместное использование памяти nginx для хранения сведений о запросе невозможно, поскольку я использую контейнер docker и модули
Ответ №1:
Изначально нет, насколько я знаю. Насколько я понимаю, вы хотите иметь глобальное ограничение на частоту доступа к определенному URL-адресу.
Вы могли бы использовать функцию Lambda @Edge в CloudFront с таблицей DynamoDB в серверной части.
Функция Lambda вызывается при каждом запросе.
Если это URL, который должен быть ограничен, он выполняет условный UpdateItem
вызов DynamoDB и пытается увеличить счетчик на единицу при условии, что счетчик еще не превышает X, где X — максимальное ограничение для вашего URL.
Если это UpdateItem
удастся, вы можете передать запрос источнику. Если вызов завершается неудачно, вы знаете, что лимит был превышен, и можете сделать перенаправление.
Таким образом, вы используете DynamoDB в качестве центрального счетчика, он должен быть достаточно быстрым и достаточно хорошо масштабироваться. Как только лимит будет превышен, вы можете кэшировать его в функции Lambda @Edge, чтобы избежать слишком большого количества запросов.
Комментарии:
1. Хорошая идея. Спасибо. Если нет прямой возможности с AWS, то, я думаю, лучше делать это программно.