我有一个我想限制访问的 API 网关端点。对于匿名用户,我想设置每日和每月限制(基于 IP 地址)。
AWS WAF 具有设置速率限制的能力,但它们的间隔是固定的 5 分钟,在这种情况下没有用处。
API Gateway 能够添加符合我需要的长期速率配额的使用计划,但不幸的是,它们似乎基于 API 密钥,我看不到通过 IP 实现的方法。
有没有办法使用 AWS 服务完成我想要做的事情?是否可以使用使用计划并为每个想要访问 api 的用户自动生成一个 api 密钥?还是有其他解决方案?
我有一个我想限制访问的 API 网关端点。对于匿名用户,我想设置每日和每月限制(基于 IP 地址)。
AWS WAF 具有设置速率限制的能力,但它们的间隔是固定的 5 分钟,在这种情况下没有用处。
API Gateway 能够添加符合我需要的长期速率配额的使用计划,但不幸的是,它们似乎基于 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 集成的第三方解决方案或其他方法.