重试尝试之间的 Aws StepFunction 通知

Aws StepFunction Notification in between Retry attempts

Aws Step 函数,假设我们有一个具有以下重试逻辑的任务,它将在 10 秒、1 分钟、6 分钟、36 分钟、3.6 小时后重试 6 次,最后在 21.6 小时后重试。但是,我想直接向 SNS 发送通知或设置警报,当 4 次尝试后重试失败时,采取措施并解决后端问题。步骤重试有可能吗?我试图查看 step 和 Lambda 的 Cloudwatch 日志,看看日志中是否存在任何差异,以确定它失败了多长时间或尝试了多少次尝试等来创建过滤器。我还没有找到任何好的解决方案。有什么我可以尝试的吗?

{
   "Type":"Task",
   "Resource":"${MyLambda}",
   "End":true,
   "Retry":[
      {
         "ErrorEquals":[
            "States.ALL"
         ],
         "IntervalSeconds":10,
         "MaxAttempts":6,
         "BackoffRate":6
      }
   ]
},

恐怕步进函数重试逻辑中没有提供您正在寻找的功能。我可以想到两种可能的解决方法。

选项 1

有一个 lambda,该 lambda 由步骤函数 lambda 中的错误 CloudWatch 日志触发(您可以按照 this 示例创建订阅过滤器)。此 lambda 将获取您的步进函数的所有 运行 次执行,并在任何 运行 长于指定时间时发出警报。

选项 2

在您的步骤函数 lambda 中,使用步骤函数 arn 和执行 ID 包装您的错误日志(在您的 lambda 中获取这些信息的一种方法是通过 context object)。有一个单独的 lambda,该 lambda 由步骤函数 lambda 中的错误 CloudWatch 日志触发。使用步进函数 arn 和执行 ID,此 lambda 可以根据步进函数执行处于 运行 状态的时间执行警报。

客户端调用示例[​​=34=](其他客户端也应该提供类似的方法)

  • Boto3 method 你可以用来获取所有 运行 步函数执行

*遗憾的是,获取步骤函数执行的客户端方法仅 return 开始日期(不是时间)。如果您可以为步骤函数执行创建命名标准,则可以从执行本身的名称推断开始时间。 (这也可能是避免 运行 尝试调用具有重复执行名称的步骤函数时出现的错误的好方法)

希望对您有所帮助!

我花了大约 4 个小时才找到与您类似的问题的解决方案。

我需要在第一次尝试失败后发送电子邮件通知。这是我为让它发挥作用所做的工作:

{
   "Type": "Task",
   "Resource": "${MyLambda}",
   "End": true,
   "Parameters": {
     "retryCount.$": "$$.State.RetryCount"
   },
   "Retry": [
      {
         "ErrorEquals": [
            "States.ALL"
         ],
         "IntervalSeconds": 10,
         "MaxAttempts": 6,
         "BackoffRate": 6
      }
   ]
},

然后在您的 lambda 函数中编写如下内容:

export const handler = (event) => {
  if (event.retryCount) {
    // send email notification
  }
};

我从 AWS 文档中获取信息:https://docs.aws.amazon.com/step-functions/latest/dg/input-output-contextobject.html