Ограничение числа пользователей, обращающихся к URL-адресу

#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, то, я думаю, лучше делать это программно.