如何处理来自 API 网关的 lambda 错误

how to handle lambda error from the API gateway

我使用 AWS 设置了一个 Lambda 函数,使用 Python 作为代理。从 API 网关,我已将 lambda(选中 'Use Lambda Proxy integration' 复选框)链接到我的 API 网关。除了 lambda 函数的最大 6mb 大小妨碍了我的大文件被成功编辑 return 之外,一切都运行良好。 lambda 打印出一个错误 "Response payload size exceeded maximum allowed payload size. Function.ResponseSizeTooLarge" 并且 API 网关从 lambda 获取此消息并打印 'Received response. Status 200'、'Lambda execution failed with status 200 due to customer function error: Response payload size exceeded maximum allowed payload size' 然后 API 网关吐出一个 502消息 'Internal Server Error'。

我希望发生的是 API 网关会看到此错误消息并自动 return 413 请求实体太大,以便我可以从我的 webapp 对特定错误状态做出反应.

过去我已经能够使用 api 网关的集成响应部分来查找此错误消息并覆盖传出状态代码,如下所示:

#set($inputRoot = $input.path('$'))
$input.json("$")
#if($inputRoot.toString().contains("ResponseSizeTooLarge"))
#set($context.responseOverride.status = 413)
#end

不幸的是,因为我正在使用 api 网关中的这个 lambda 函数作为 lambda 代理,所以我无法使用集成响应来搜索此特定消息并覆盖传出状态代码。

有没有其他方法可以让 API 网关看到它从 lambda 获得的这个 200 实际上有一条错误消息,无论如何应该是 413? 我能想到的唯一其他方法是在 return 手动将其发送到 API 网关之前检查 lambda 的有效负载大小,然后在 returning 之前更改状态代码如果它太大。我不想这样做,因为我看到在 python 中获取对象字节大小的唯一方法是导入 sys 并使用:

sys.getsizeof(lambdaResponse)

这似乎只是 return 大小约为 258,尽管其内容的实际大小比这大得多。我也不想检查每个有效负载的大小,因为它可能会给不太大而无法处理的响应增加不必要的延迟。

到目前为止,还没有实现此目的的默认方法。正如您所说,您能做的最好的事情就是检查 lambda 本身的有效负载大小,然后检查 return/throw 异常。


只是一个建议,如果您的用例要求响应负载超过 lambda 函数的允许限制,我建议将响应负载存储在某个 s3 存储桶中,return s3 url 的有效载荷作为响应。这样,您的应用程序将随着响应负载的增加而很好地扩展。此外,如果这些响应是可缓存的,您将可以轻松地重新使用相同的 s3Url,只需稍微修改您的应用程序逻辑。

因此,不幸的是,api 网关没有默认方法来处理这种情况,但在 lambda 函数中仍然可以选择处理此错误。在 return 将 lambda 的响应发送到 api 网关之前,我使用了 mango 的建议并使用以下方法检查了响应的字节大小:

len(json_obj.encode("utf-8"))

如果它超过了 lambda 的限制 return 我将 response.status 更改为 413 并将正文更改为解释发生的事情的错误消息