首页 > 解决方案 > 错误处理程序未捕获 Aws 阶跃函数超时

问题描述

我有以下状态,其中超时没有被捕获,但是有“States.ALL”的捕获。根据这里https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html 它应该是。你能告诉我有什么问题吗?

   "PublishIotCmd&WaitTask": {
      "Next": "SuccedTask",
      "Retry": [
        {
      [..]
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.error",
          "Next": "ErrorHandlerTask"
        }
      ],
      "Type": "Task",
      "TimeoutSeconds": 600,
      "ResultPath": "$.cmdResult",
      "Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
      "Parameters": {
        "FunctionName": "xx",
        "Payload": {
          "token.$": "$$.Task.Token",
          "request.$": "$.detail"
        }
      }
    },

在特定情况下,超时是由于任务没有通过 sendTaskSuccess 获得令牌。错误当然是这个,但没有调用“ErrorHandlerTask”,状态机只是挂起。

const publishIot = new tasks.LambdaInvoke(this, 'PublishIotCmd&WaitTask', {
  lambdaFunction: iotSendCommandFn,
  payload: sfn.TaskInput.fromObject({
    token: sfn.JsonPath.taskToken,
    //request: sfn.JsonPath.entirePayload,
    request: sfn.JsonPath.stringAt('$.detail'),
  }),
  resultPath: '$.cmdResult',
  integrationPattern: sfn.IntegrationPattern.WAIT_FOR_TASK_TOKEN,
  timeout: Duration.minutes(TIMEOUT_WAIT_REPLY_SECONDS),

先感谢您

标签: aws-cdkaws-step-functions

解决方案


对于任务令牌,我相信您应该使用心跳超时而不是一般超时。

在文档中,它调用了““HeartbeatSeconds”:600 字段将心跳超时间隔设置为 10 分钟。并且“如果等待任务在 10 分钟内没有收到有效的任务令牌,则任务将失败并出现 States.Timeout 错误名称。”

我认为因为它是一个不同的服务集成,Heartbeat 在这里工作。

https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-wait-token


推荐阅读