微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Go Lambda 的 AWS Step Function 错误处理

如何解决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 函数最终成功)。

我找不到关于此的太多文档,但是:

  1. 是否可以匹配实际的错误消息(我看到 API Gateway 允许这样做,使用 RegEx);
  2. 如果这是不可能的,我应该返回一个不同的“错误类型”,而不是 error

提前致谢!

解决方法

终于解开了谜底;最后,它与 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?