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

时间:2017-03-07 22:01:33

标签: python http aws-lambda aws-api-gateway

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

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

Integration Responses

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

如果引发的异常与已配置的响应不匹配,如何返回500,而在Python函数成功返回时仍然返回200?我是否只需要在我的代码中包装所有内容(使用try除外),这可能引发异常并生成可预测的errorMessage字符串?

编辑:

我目前通过使用(.|\n)*的Lambda Error Regex进行500的积极响应来实现此目标。这是将未处理的异常作为500个错误捕获的合理方法吗?

编辑:

事实证明,当Python函数返回时没有异常,此配置会产生500个错误。

Integration Responses 2

我希望Lambda Error Regex只在Python函数引发实际异常时才尝试匹配(因为它们只根据文档检查errorMessage字段)。导致它回退到201的默认方法(在更新的方案中)。奇怪的是,当使用API​​ GW控制台'Test'进行测试时,它返回400,但在从其他任何地方进行测试时,它会给出500(在500 Integration Response中定义的主体映射)。

我能想到将所有未处理的异常作为500返回的唯一方法是从我的Python函数中raise Exception('Success')而不是return - 然后让201 Lambda Error Regex匹配'Success'...我真的不愿意这样做。

1 个答案:

答案 0 :(得分:1)

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

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