【问题标题】:how to handle lambda error from the API gateway如何处理来自 API 网关的 lambda 错误
【发布时间】:2020-08-05 23:50:10
【问题描述】:

使用 AWS,我使用 Python 设置了一个 Lambda 函数作为代理。从 API 网关,我已将 lambda(选中“使用 Lambda 代理集成”复选框)链接到我的 API 网关。一切工作正常,除了 lambda 函数的最大 6mb 大小妨碍了我的大文件成功返回。 lambda 打印一条错误消息,指出“响应负载大小超出了允许的最大负载大小。Function.ResponseSizeTooLarge”,API 网关从 lambda 获取此消息并打印“收到的响应。状态 200”、“由于客户函数错误,Lambda 执行失败,状态为 200:响应负载大小超过了允许的最大负载大小”,然后 API 网关会输出 502 并显示消息“内部服务器错误”。

我期望发生的是 API Gateway 会看到此错误消息并自动返回 413 Request Entity Too Large,以便我可以从我的 webapp 对特定错误状态做出反应。

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

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

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

是否有另一种方法可以让 API Gateway 看到它从 lambda 获得的这 200 实际上有一条错误消息,并且应该是 413? 我能想到的唯一另一种方法为此,请在手动将其返回到 API Gateway 之前检查 lambda 的有效负载大小,然后在返回之前更改状态代码(如果它太大)。我不想这样做,因为我看到在 python 中获取对象字节大小的唯一方法是导入 sys 并使用:

sys.getsizeof(lambdaResponse)

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

【问题讨论】:

    标签: amazon-web-services error-handling aws-lambda aws-api-gateway http-status-code-413


    【解决方案1】:

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


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

    【讨论】:

    • 我确实相信这个 s3 解决方案将是最终目标,但目前这些响应无法放入 s3。当我们将这些响应迁移到云时,我一定会牢记这个想法。至于现在你是否熟悉 python 的 sys.getsizeof() 方法以及如何让它返回我传入的任何对象的字节大小?在我的 lambda 响应中给我正确的字节值似乎是不可靠的。
    • @skyleguy,这些响应负载将以 JSON 格式流动,这意味着您可以将对象序列化为字符串并计算其长度,例如:len(json_obj.encode("utf-8"))。
    【解决方案2】:

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

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

    如果超过了 lambda 可以返回的限制,我将 response.status 更改为 413,并将正文更改为解释发生了什么的错误消息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-28
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 2017-08-04
      相关资源
      最近更新 更多