Lambda返回对象场景下API Gateway响应映射配置咨询
解决方案
核心思路是不序列化错误对象,直接将带自定义属性的Error实例作为错误返回,同时满足SDK直连和API Gateway状态码映射两个场景。
一、Lambda函数代码改造
不要使用context.fail()+序列化错误对象的写法,直接构造带自定义错误码属性的Error实例,通过callback第一个参数返回(async函数中可直接throw该错误实例,效果一致)。改造后的完整代码如下:
module.exports = { handler: async (event, context, callback) => { const rnd = Math.random(); if (rnd > 0.33) { // 成功响应,保持原有逻辑 callback(null, { att: "value" }); } else if (rnd > 0.66) { // 404错误场景 const err = new Error("Error message"); err.name = "ITEM_NOT_FOUND"; err.code = "ITEM_NOT_FOUND"; // 显式挂载code字段,方便SDK直接读取 callback(err); } else { // 通用400错误场景 const err = new Error("Error message"); err.name = "GENERIC_ERROR_CODE"; err.code = "GENERIC_ERROR_CODE"; callback(err); } } }
该写法下,通过AWS SDK调用Lambda时,catch块捕获到的错误对象会直接携带name、code、message属性,直接读取err.code即可拿到错误码,无需额外解析errorMessage字段的JSON字符串。如果是纯async/await写法,不需要调用callback,直接throw err即可,Lambda会自动将抛出的Error实例识别为错误返回。
二、API Gateway集成响应配置
在API Gateway控制台配置集成响应规则,按优先级从高到低配置3条规则,通过正则匹配Lambda返回的错误内容映射状态码:
- 200状态码规则:默认成功规则,匹配Lambda无错误返回(即
callback第一个参数为null)的场景,直接映射返回结果即可。 - 404状态码规则:配置Lambda错误匹配正则为
.*ITEM_NOT_FOUND.*,只要错误内容中包含ITEM_NOT_FOUND字符串就命中规则,返回404状态码,可按需配置响应体映射模板,该正则容错性高,不受序列化格式的空格、转义字符影响。 - 400状态码规则:配置Lambda错误匹配正则为
.*(通配所有错误场景),因为优先级低于404规则,所有未匹配到404的错误都会落到该规则,返回400状态码。
配置说明:Lambda返回错误时,会将Error实例的所有可枚举属性序列化为字符串返回给API Gateway,因此正则可以直接匹配到我们挂载的错误码字段值,无需额外解析逻辑。
内容的提问来源于stack exchange,提问作者Mehran
相关产品推荐
相关产品推荐

