如何限制特定 API 网关路由的有效负载大小

Posted

技术标签:

【中文标题】如何限制特定 API 网关路由的有效负载大小【英文标题】:How to limit payload size for a specific API Gateway route 【发布时间】:2019-12-11 12:25:45 【问题描述】:

我目前有一个由对 API 网关路由的请求触发的 lambda,并且我对如何为该路由设置有效负载限制(例如 2kb)进行了一些研究。我的目标是保证我的 lambda 永远不会收到大量输入来处理,因此它的执行时间会很短且成本较低。

我发现 AWS API Gateway 的默认有效负载限制为 10 MB,而 AWS Lambda 的默认限制为 6 MB。两者都不能增加。

但是,我没有找到任何关于如何减少它的文档或讨论。可能吗?是否有任何其他 AWS 服务可以用作 API Gateway 和我的 lambda 之间的中间件来限制接收到的输入?还是应该用其他方法解决?

【问题讨论】:

【参考方案1】:

AWS API Gateway 不具备您所描述的功能。

您所描述的我会考虑 WAF 功能,而 AWS WAF 确实具有此功能。

https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-size-conditions.html

我不愿添加以下内容,因为这是对工具集的完全误用,但是...

仅使用 API 网关来限制有效负载大小的一种肮脏且可能不准确的方法是使用集成响应中的主体映射模板中的 IF 语句检查传入请求的主体长度,如果超过一定长度,忽略它。

假设 Content-Type 为 application/json 的示例:

#set($allParams = $input.params())

#if ($input.body.length() < 5000)
    "request" : $input.json('$')
#else
    "request" : null
#end

5000 只是一个任意数字,我没有计算过。

即使负载很大(很长),这样做仍然会导致调用您的 Lambda 函数,并且 Lambda 需要能够处理空请求,但它永远不会收到更多的请求超过 5000 个字符。

【讨论】:

谢谢!很高兴知道通过 API Gateway 有一个解决方法,尽管我不会使用它,因为它不建议使用。我计划使用 lambda-proxy 通过我的 lambda 验证每个请求的 Content-Length 标头,但我会检查 AWF。我将首先分析它的成本,但我想要任何提示/建议:对于这个问题,AWF 是否比 lambda 便宜,还是相反?考虑 100 毫秒的 lambda 执行 + 一些冷启动时间。 我显然建议您自己定价,但对于一个 API 的一条规则,AWS WAF 的粗略估计是每月 100 万次调用 6.60 美元,接下来的 100 万次调用 0.60 美元。请记住,无论如何,大多数调用最终都会通过 Gateway 和 Lambda,因此在处理之前快速检查 Lambda 中的内容长度可以忽略不计。

以上是关于如何限制特定 API 网关路由的有效负载大小的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 api 网关限制资源访问

本地测试时微服务如何路由

API网关的认证和授权

Kong网关之负载均衡、动态路由配置

JSON 有效负载、AWS Lambda (Python)、API 网关

我们如何使用 Kong 替换现有的 Nginx?