AWS REST API Gateway非代理集成无法返回5xx错误码求助
解决AWS REST API Gateway非代理集成Lambda返回5xx状态码的问题
核心问题分析
非代理集成模式下,API Gateway对Lambda的响应区分两种情况:
- Lambda正常返回对象:无论内容是否包含
errorMessage,都会被判定为成功响应,走默认的200集成响应映射。 - Lambda抛出未捕获异常:才会被识别为集成错误,触发错误类型的集成响应规则。
你之前尝试返回带errorMessage的对象属于成功响应,所以始终返回200,只有抛出异常才能触发错误映射。
具体解决步骤
1. Lambda代码调整
需要触发5xx时,直接抛出包含目标状态码的异常,示例(以Python/Node.js为例):
# Python示例 def lambda_handler(event, context): # 触发511错误 raise Exception("511: Network Authentication Required")
// Node.js示例 exports.handler = async (event) => { // 触发512错误 throw new Error("512: Custom Server Error"); };
2. API Gateway集成响应配置
- 进入对应方法的集成响应设置,删除之前错误配置的500普通映射,添加错误类型的集成响应:
- 点击
Add Integration Response,在Lambda Error Regex中输入匹配异常信息的正则,比如要匹配所有5xx开头的错误,用^5\d{2}:.* - 在
Method Response Status下拉框中选择你要返回的状态码(需提前在方法响应中添加该5xx码,比如511、500等) - 配置映射模板(可选),动态设置状态码并返回错误内容:
#set($errorParts = $input.path('$.errorMessage').split(':')) #set($context.responseOverride.status = $errorParts[0]) { "error_code": "$errorParts[0]", "error_message": "$errorParts[1].trim()" }
- 点击
3. 关键注意事项
- 必须通过抛出异常触发错误响应,返回对象无法触发非代理模式下的错误映射。
- 方法响应中必须提前添加你要返回的所有5xx状态码,否则无法选择映射。
- 正则表达式要准确匹配Lambda抛出的
errorMessage开头,比如你抛出的是511: xxx,正则^511:.*就能精准匹配该错误。
内容的提问来源于stack exchange,提问作者Mercury
相关产品推荐
相关产品推荐

