Как добавить ограничения скорости на основе ip с более длинными интервалами в API Gateway? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть конечная точка шлюза API, доступ к которой я хотел бы ограничить. Для анонимных пользователей я бы хотел установить дневные и месячные лимиты (на основе IP-адреса).

AWS WAF имеет возможность устанавливать ограничения скорости, но интервал для них составляет фиксированные 5 минут, что бесполезно в этой ситуации.

API Gateway имеет возможность добавлять планы использования с более долгосрочными квотами, которые бы соответствовали моим потребностям, но, к сожалению, они основаны на ключах API, и я не вижу способа сделать это по IP.

Есть ли способ выполнить то, что я пытаюсь сделать, используя AWS Services? Возможно ли использовать план использования и автоматически генерировать ключ API для каждого пользователя, который хочет получить доступ к API? Или есть какое-то другое решение?

1 Ответ

1 голос
/ 12 июля 2019

Без дополнительного контекста о вашем конкретном сценарии использования или архитектуре вашей системы трудно дать ответ «передового опыта».

Как и большинство технических вещей, есть несколько способов, которыми вы могли бывыполнить это.Одним из способов было бы использовать комбинацию ведения журнала CloudWatch API, Lambda, DynamoDB (с потоками) и WAF.

На высоком уровне (и независимо от этой конкретной потребности) я бы защитил свой API с помощью WAF икраткое руководство по автоматизации безопасности AWS, , найденное здесь , и связывание его с моим API-шлюзом, как указано в документации здесь .Как только мой WAF будет настроен и связан с моим API-шлюзом, я включу ведение журнала CloudWatch API для API-шлюза, как обсуждалось здесь .Теперь, когда у меня все настроено, я бы создал две лямбды.

Первый анализирует журналы API CloudWatch и записывает данные, которые меня интересуют (IP-адрес и время запроса), в таблицу DynamoDB.Чтобы избежать ненужных затрат на хранение, я бы установил значение TTL для записи, которую я записываю в свою таблицу DynamoDB, в два раза больше, чем временная метрика моего анализа ... т.е. если я хочу ограничить ее до 1000 запросов в 1 месяцЯ бы установил TTL для моей записи в DynamoDB на 2 месяца.Оттуда моя группа журналов API CloudWatch будет иметь фильтр подписки, который отправляет данные журнала в эту лямбду, как описано здесь 1014 *.

Моя вторая лямбда будет выполнять фактический анализ и обработкучто происходит, когда моя метрика превышена.Эта лямбда будет вызвана событием записи в мою таблицу DynamoDB, как описано здесь .Я могу заставить эту лямбду запускать любой анализ, какой захочу, но я собираюсь предположить, что я хочу ограничить доступ до 1000 запросов в месяц для данного IP.Когда новый элемент DynamoDB запускает мою Lambda, Lambda собирается запросить в таблице DynamoDB все записи, которые были созданы в предыдущем месяце с того момента и которые содержат IP-адрес.Если количество возвращенных записей меньше или равно 1000, это ничего не изменит.Если оно превышает 1000, то Lambda собирается обновить WAF WebACL и, в частности, UpdateIPSet , чтобы отклонить трафик для этого IP, и все.Довольно просто.

Благодаря описанному выше процессу я почти в режиме реального времени отслеживаю запросы к моему API-шлюзу очень эффективным, экономичным и масштабируемым способом, который можно развернуть полностью без сервера.

Это всего лишь один из способов справиться с этим, есть, безусловно, другие способы, с помощью которых вы можете сделать это, например, с помощью Kinesis и Elastic Search, или вместо журналов вы можете анализировать события CloudTail, или с помощью стороннего решения, которое интегрируется с AWSили что-то еще.

...