AWS API Gateway 限制未按预期工作
Posted
技术标签:
【中文标题】AWS API Gateway 限制未按预期工作【英文标题】:AWS API Gateway Throttling not working as expected 【发布时间】:2020-11-18 08:35:26 【问题描述】:我正在尝试启用 API 网关限制,但它没有按预期工作。
我将 Default Method Throttling Rate 设置为每秒 1 个请求,并将 Burst 设置为 1 个请求。
然后我在我的代码中创建了一个循环,以向我的 API 端点同时发出 10 个请求。
for (let i=0; i<10; i++)
axios.get(url);
预期的结果是:
1 个成功的请求 9 个限制请求(HTTP 429 错误)但实际结果却相反:
9 个成功请求 1 个受限制的请求(HTTP 429 错误)我重复了这个过程,但是同时发出了 20 个请求,结果是:
16 个成功请求 4 个受限制的请求(HTTP 429 错误)在此 API 方法的 CloudWatch 日志中,我发现了不同的日志流,每个流只有几毫秒的差异。
如果我将 Rate 设置为每秒 0 个请求并将 Burst 设置为 0 个请求,则节流工作并且所有请求都会得到节流。但是当我将 Rate and Bust 设置为 1 时,它并没有按预期工作。
为什么会这样?我需要将我的 API 限制为每秒 1 个请求。
【问题讨论】:
您在测试节流时是否使用了相同的 API 密钥?这些限制适用于每个 API 密钥。 还要确保在编辑限制时,将 API 部署到活动阶段以使其生效 我没有使用任何 API 密钥。 API 方法是公开的。 这是你的问题,这个限制是基于 api 密钥的使用计划。 @Cascader 在下面正确回答 那么,您是说没有 API 密钥/使用计划就无法限制公共 API?那么,为什么有些请求会返回 HTTP 429 - Too Many Requests? 【参考方案1】:有两种方法可以限制 API 调用:
-
Account-level throttling
API-level and stage-level throttling
当您需要应用 API 级别或阶段级别的节流时,您必须使用usage plans:
使用计划指定谁可以访问一个或多个已部署的 API 阶段和方法,以及他们可以访问它们的数量和速度
【讨论】:
那么,如果没有 API 密钥/使用计划,就无法限制公共 API?那么,为什么我的一些请求返回 HTTP 429 - Too Many Requests? 这就是记录的内容,但实际上您可以将限制设置为任何公共端点,至少对于 apigatewayv2:aws apigatewayv2 update-stage --api-id 4767ptc6kh --stage-name foo --route-settings '"GET /proxy":"ThrottlingBurstLimit":1,"ThrottlingRateLimit":1'
如上所述,它不能按预期工作,因为似乎有多个 API 网关不共享过滤器和独立运行的实例。【参考方案2】:
对于较小的速率/突发值,AWS API Gateway 节流似乎不是很精确。
我想象有多个 API Gateway 的“实例”在运行,并且 rate 和 burst 的值是“最终一致的”。
但是我没有找到任何相关文档。
当我发出初始请求并在发出其他 99 个请求之前等待 500 毫秒时,结果“不太精确”。
例子:
axios.get(url);
setTimeout(function()
console.log("After 500 ms");
for (let i=0; i<99; i++)
axios.get(url);
, 500);
结果:
一旦我获得 1 次成功和 99 次油门。 其他时候我获得了 12 次成功和 88 次油门。 其他时候我获得了 33 次成功和 67 次油门。但是,很难获得一致的结果。
【讨论】:
以上是关于AWS API Gateway 限制未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
通过 API Gateway 保护对 AWS Lambda 的访问
如何通过 Cognito 用户 ID 限制访问 AWS API Gateway 端点
Terraform (0.12.29) 导入未按预期工作;导入成功,但计划显示销毁并重新创建