AWS Step Function中Go Lambda返回错误的条件匹配配置问题
Go Lambda 错误在AWS Step Functions中的匹配方案
问题1解答:是否支持错误消息正则匹配?
- AWS Step Functions的
Retry/Catch字段中的ErrorEquals规则仅支持完全匹配Lambda返回的errorType字段值,不支持对errorMessage做任何正则、前缀、包含匹配。 - 你之前配置
"errorString"能生效,是因为Go标准库errors.New()创建的错误统一为errorString类型,Lambda Go运行时会把错误的类型名作为errorType字段返回,所以所有标准error都会命中这个规则,会误匹配其他非瞬态错误,不推荐这么用。
问题2解答:如何返回能被精准匹配的错误类型
你只需要自定义实现error接口的专属错误类型即可,Lambda Go运行时会自动将自定义类型的名称作为errorType返回,Step Functions可以直接匹配该类型名。
代码示例:
// 首先定义专属错误类型,名称和你要匹配的ErrorEquals值一致 type TransientError string // 实现error接口的Error()方法 func (e TransientError) Error() string { return string(e) } func HandleHotelBookingRequest(ctx context.Context, booking HotelBookingRequest) (confirmation HotelBookingResponse, err error) { // ... 其他逻辑 if statusCode == http.StatusServiceUnavailable { // 返回自定义错误类型实例 return confirmation, TransientError("upstream service 503 unavailable") } // ... 其他错误处理 }
效果验证:
此时Lambda触发该错误时返回的结构会变为:
{ "errorMessage": "upstream service 503 unavailable", "errorType": "TransientError" }
你原来配置的"ErrorEquals": ["TransientError"]重试规则就可以正常生效,且只会匹配你定义的瞬态错误,不会误命中其他错误。
可选替代方案
如果你不想自定义错误类型,也可以选择让Lambda函数永远不返回error,而是在返回结构体中新增errorCode、httpStatus这类标识字段,后续在Step Functions中通过Choice状态判断对应字段的值,自行实现重试分支逻辑,适合需要更复杂错误判断规则的场景。
内容的提问来源于stack exchange,提问作者Marco Massenzio
相关产品推荐
相关产品推荐

