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 的访问

select count() 查询中的限制子句未按预期工作

如何通过 Cognito 用户 ID 限制访问 AWS API Gateway 端点

Terraform (0.12.29) 导入未按预期工作;导入成功,但计划显示销毁并重新创建

无服务器框架 AWS REST API Gateway - 403 CORS 错误

AlamoFire GET api 请求未按预期工作