【问题标题】:Retry logic in AWS step functionAWS step 函数中的重试逻辑
【发布时间】:2021-08-18 15:59:57
【问题描述】:

我正在测试 step 函数的重试逻辑。 理论上,如果失败,应该重试执行 lambda 3 次之后的 step 函数。

{
  "StartAt": "Bazinga",
  "States": {
    "Bazinga": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-southeast-2:518815385770:function:errorTest:$LATEST",
        "Payload": {
          "Input.$": "$"
        }
      },
      "Retry" : [
        {
          "ErrorEquals": [ "States.All", "States.Timeout" ],
          "IntervalSeconds": 1,
          "MaxAttempts": 3,
          "BackoffRate": 1.0
        }
      ],
       "Next": "Fail"
    },
    "Fail": {
      "Type": "Fail"
    }
  }
}

它调用的 lambda 设置为 3 秒后超时。 lambda 冻结 4 秒。这意味着 lambda 超时并抛出 States.Timeout 错误。代码如下:

function sleep(ms){
    return new Promise(resolve=>{
        setTimeout(resolve,ms)
    })
}

exports.handler = async (event) => {
    console.log('------------> executing ....')
    await sleep(4000)
};

问题是 step 函数不重试任务。这可以从以下CloudWatch 日志中确认。


05:59:36
START RequestId: dd1a2ee9-f389-44be-aaa6-07f2ca7983b0 Version: $LATEST

05:59:36
2019-07-24T05:59:36.340Z dd1a2ee9-f389-44be-aaa6-07f2ca7983b0 INFO ------------> executing ....

05:59:39
END RequestId: dd1a2ee9-f389-44be-aaa6-07f2ca7983b0

05:59:39
REPORT RequestId: dd1a2ee9-f389-44be-aaa6-07f2ca7983b0 Duration: 3003.29 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 26 MB

05:59:39
2019-07-24T05:59:39.317Z dd1a2ee9-f389-44be-aaa6-07f2ca7983b0 Task timed out after 3.00 seconds 

不知道出了什么问题。任何帮助表示赞赏,在此先感谢。

【问题讨论】:

    标签: aws-lambda aws-step-functions


    【解决方案1】:

    为了回答我自己的问题,我放置的重试逻辑存在 2 个问题。

    1. States.All 应该是 States.ALL(注意 L 的大小写)
    2. 当 lambda 超时时,抛出的错误是 Lambda.Unknown 而不是 States.Timeout

    我用以下代码更新了我的 step 函数,现在它可以工作了:

    {
      "StartAt": "Bazinga",
      "States": {
        "Bazinga": {
          "Type": "Task",
          "Resource": "arn:aws:states:::lambda:invoke",
          "Parameters": {
            "FunctionName": "arn:aws:lambda:ap-southeast-2:518815385770:function:errorTest:$LATEST",
            "Payload": {
              "Input.$": "$"
            }
          },
          "Retry" : [
            {
              "ErrorEquals": [ "States.Timeout", "Lambda.Unknown" ],
              "IntervalSeconds": 1,
              "MaxAttempts": 3,
              "BackoffRate": 1.0
            }
          ],
           "Next": "Fail"
        },
        "Fail": {
          "Type": "Fail"
        }
      }
    }
    

    【讨论】:

    • States.Timeout 如果状态配置了超时并且调用未在该时间段内返回,则会引发。
    • "Lambda.Unknown" 是 step 函数接收 lambda 超时的方式
    【解决方案2】:

    因为您没有在 ASL 中定义 TimeoutSeconds。示例:

    "Type": "Task",
    "Resource": "${FunctionArn}",
    "TimeoutSeconds": 3,
    

    否则会抛出Lambda.Unknown失败

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-27
      • 2022-10-06
      • 2022-11-08
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多