如何解决Go Lambda 的 AWS Step Function 错误处理
我找不到有关如何根据 Go 处理程序返回的错误在 Step 函数中定义错误条件匹配器的详细说明。
handler
是一个沼泽标准 Go 函数,如果它从上游服务获得 503,则返回一个 error
:
func HandleHotelBookingRequest(ctx context.Context,booking HotelBookingRequest) (
confirmation HotelBookingResponse,err error) {
...
if statusCode == http.StatusServiceUnavailable {
err = errors.New("TransientError")
} else {
我可以控制函数返回的内容,以及它如何格式化字符串;我找不到任何关于在这里使用什么的真实信息(或者在 Catch
子句中,就此而言),所以这与上面的匹配:
"Retry": [
{
"ErrorEquals": [
"TransientError"
],"BackoffRate": 1,"IntervalSeconds": 1,"MaxAttempts": 3,"Comment": "Retry for Transient Errors (503)"
}
]
当我在控制台中测试 Lambda 时,当上游返回 503 时,这就是我得到的(正如预期的那样):
{
"errorMessage": "TransientError","errorType": "errorString"
}
如果我改为:
"ErrorEquals": [
"errorString"
],
Retry
有效(至少,查看 CloudWatch 日志,我可以看到 transient error
被记录,但 Step 函数最终成功)。
我找不到关于此的太多文档,但是:
提前致谢!
解决方法
终于解开了谜底;最后,它与 JavaScript 方法(它(a)给了我提示并且(b)在示例中被广泛记录)是微不足道的并且完全相同;然而,由于我无法在任何地方找到特定于 Go 的答案(在 AWS - 广泛的、好的、详细的文档中,谷歌,这里)我将其发布在这里以供将来参考。
TL;DR - 定义您自己的 error
接口实现并返回该类型的对象,而不是沼泽标准 fmt.Error()
,然后使用该类型ErrorEquals
子句中的名称。
this gist 中显示了一个非常基本的示例实现。
为了测试这一点,我创建了一个 ErrorStateMachine
(同一个 gist 中的 JSON 定义)并根据 ErrorEquals
类型选择了一个不同的捕获器:
{
"ErrorEquals": [
"HandlerError"
],"Next": "Handler Error"
}
使用不同的 Outcome
输入测试 Step Function,导致选择不同的路径。
我想让我失望的是,当谈到 Go 时,我是一个相对初学者,我没有意识到 errorString
是 {{ 返回的 error
接口的实际类型1}} 方法,在 errors.New()
中使用:
fmt.Errorf()
我天真地认为这只是 AWS 命名的东西。
一个有趣的转折(这并不理想)是实际的错误消息被“包裹”在 Step 函数输出中,并且在后续步骤中解析可能有点麻烦:
// in errors/errors.go
// errorString is a trivial implementation of error.
type errorString struct {
s string
}
如果将实际错误消息(由 {
"Error": "HandlerError","Cause": "{\"errorMessage\":\"error from a failed handler\",\"errorType\":\"HandlerError\"}"
}
生成)直接发送到 Error()
字段中,肯定会很多对开发人员更友好。
希望其他人觉得这很有用,而不必像我一样浪费时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。