如何在 API 网关上添加间隔更长的基于 IP 的速率限制?



我有一个 API 网关终端节点,我想限制对它的访问。对于匿名用户,我想设置每日和每月限制(基于 IP 地址)。

AWS WAF 能够设置速率限制,但间隔为固定的 5 分钟,这在这种情况下没有用。

APIGateway 能够添加具有长期速率配额的使用计划,以满足我的需求,但不幸的是,它们似乎基于 API 密钥,我看不到通过 IP 做到这一点的方法。

有没有办法完成我尝试使用 AWS 服务执行的操作? 是否可以使用使用计划并为想要访问 API 的每个用户自动生成一个 api 密钥?还是有其他解决方案?

如果没有更多关于特定用例或系统架构的上下文,就很难给出"最佳实践"答案。

像大多数技术一样,有几种方法可以做到这一点。一种方法是结合使用CloudWatch API日志记录,Lambda,DynamoDB(带Streams)和WAF。

在高级别(无论此特定需求如何),我将使用 WAF 和 AWS 安全自动化快速入门(可在此处找到)保护我的 API,并将其与我的 API 网关关联,如此处文档中的指导。设置好 WAF 并与 API 网关关联后,我将为 API 网关启用 CloudWatch API 日志记录,如此处所述。现在我已经设置好了,我将创建两个 Lambda。

第一个将解析 CloudWatch API 日志并将我感兴趣的数据(IP 地址和请求时间)写入 DynamoDB 表。为了避免不必要的存储成本,我将写入 DynamoDB 表的记录上的 TTL 设置为分析的时态指标的两倍......即,如果我希望将其限制为每 1 个月 1000 个请求,我会将 DynamoDB 记录上的 TTL 设置为 2 个月。从那里,我的 CloudWatch API 日志组将有一个订阅筛选条件,用于将日志数据发送到此 Lambda,如此处所述。

我的第二个 Lambda 将进行实际分析并处理超出我的指标时会发生什么。此 Lambda 将由写入事件触发到我的 DynamoDB 表,如此处所述。我可以让这个 Lambda 运行我想要的任何分析,但我会假设我想将给定 IP 的访问限制为每月 1000 个请求。当新的 DynamoDB 项目触发我的 Lambda 时,Lambda 将在 DynamoDB 表中查询从该时刻起在上个月创建并包含 IP 地址的所有记录。如果返回的记录数小于或等于 1000,则它将不执行任何操作。如果超过 1000,则 Lambda 将更新 WAF WebACL,特别是 UpdateIPSet 以拒绝该 IP 的流量,仅此而已。很简单。

通过上述流程,我可以近乎实时地监控对我的 API 网关的请求,以一种非常高效、经济高效、可扩展的方式,可以完全无服务器部署。

这只是处理此问题的一种方法,肯定还有其他方法可以使用 Kinesis 和 Elastic Search 来实现此目的,或者您可以分析 CloudTail 事件而不是日志,或者使用与 AWS 集成的第三方解决方案或其他方法。

最新更新