API Gateway 500 对未处理异常的响应

Posted

技术标签:

【中文标题】API Gateway 500 对未处理异常的响应【英文标题】:API Gateway 500 Response on Unhandled Exception 【发布时间】:2017-07-28 07:16:15 【问题描述】:

我在与 Python Lambda 函数集成的 API 网关上有一个方法。如果在我的 Python Lambda 函数中引发异常,其中 errorMessage 字段与该方法的集成响应中的正则表达式之一不匹配,我希望我的 API 网关返回 500 响应。

如果没有引发异常并且 lambda 返回没有失败,我只想返回 200。

使用上图中的设置 - 任何与 400 响应的 (.|\n)*'type':\s*'.*Error'(.|\n)* 不匹配的异常都会给出 200 响应。

如果引发任何与已配置响应不匹配的异常,我如何返回 500 - 当 Python 函数成功返回时仍返回 200?我是否只需将所有可能引发异常并生成可预测的 errorMessage 字符串的代码(使用 try except)包装起来?

编辑:

我目前正在通过 500 的集成响应和 (.|\n)* 的 Lambda 错误正则表达式来“实现这一目标”。这是将未处理的异常捕获为 500 个错误的合理方法吗?

编辑:

当 Python 函数没有异常返回时,这个配置给出了 500 个错误。

我希望 Lambda 错误正则表达式仅在 Python 函数引发实际异常时尝试匹配(因为它们仅根据文档检查 errorMessage 字段)。导致它回退到 201 的默认方法(在更新的场景中)。奇怪的是,它在使用 API GW 控制台“测试”进行测试时返回 400,但在从其他任何地方尝试时给出 500(在 500 集成响应中定义的主体映射)。

我认为将所有未处理的异常返回为 500 的唯一方法是从我的 Python 函数返回 raise Exception('Success') 而不是 return - 然后让 201 Lambda 错误正则表达式匹配“成功”......我真的而不是这样做。

【问题讨论】:

【参考方案1】:

鉴于 API Gateway 的错误响应处理机制的局限性,您当前的方法是合理的。

API Gateway 团队收到了多个客户的反馈,指出我们的错误处理支持存在缺陷。我们正在积极努力改进这一点,并希望在未来提供改进的错误处理体验。

【讨论】:

我可能说得太早了。似乎我配置它的方式是给出 500 个响应,即使函数返回时没有异常。我已经用更多信息更新了原始帖子。 Lambda 为 200 情况下的错误消息返回一个空字符串。将您的 500 Lambda 错误正则表达式更改为 (.|\n)+ 以便它至少需要一个字符并且不会匹配空字符串。

以上是关于API Gateway 500 对未处理异常的响应的主要内容,如果未能解决你的问题,请参考以下文章

将 AWS Lambda 429 错误映射到 API Gateway 2XX 响应

AWS API Gateway 集成响应

使用 AWS API Gateway 和 Java 处理错误响应状态代码/实体

android服务如何对未处理的异常做出反应?

yii2 rest api异常处理

AWS API Gateway - Lambda - 内部服务器错误