【问题标题】:AWS Step Functions is not catching States.Runtime errorAWS Step Functions 未捕获 States.Runtime 错误
【发布时间】:2020-06-12 08:30:51
【问题描述】:

下面的 step 函数在 aws 中执行,当缺少必需的参数时,它会取消流程并抛出 States.Runtime 错误。这是在 step 函数的 catch 阶段,但它没有像所述的那样捕获错误。

定义的Step函数如下,

{
  "StartAt": "Log Start Step Function",
  "Comment": "Executed with inputs",
  "States": {
    "Log Start Step Function": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:eu-west-1:0000000:function:update",
      "Parameters": {
        "body": {
          "itemID.$": "$.itemID",
          "functionName.$": "$.stepFunctionName ",
          "executionARN.$": "$$.Execution.Id",
          "complete": false,
          "inprogress": true,
          "error": false
        }
      },
      "Catch": [
        {
          "ErrorEquals": [
            "States.Runtime"
          ],
          "ResultPath": "$.taskresult",
          "Next": "Log Failed Module"
        },
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.taskresult",
          "Next": "Log Failed Module"
        }

      ],
      "ResultPath": "$.taskresult",
      "Next": "Evaluate Module PA1"
    }
  }
}

下面是step函数,

抛出的错误如下,

运行时错误未执行记录失败的模块。

{
   "ErrorEquals": [
       "States.Runtime"
    ],
    "ResultPath": "$.taskresult",
    "Next": "Log Failed Module"
  },

这是 AWS 错误还是此处完成的配置有问题,或者是否有任何其他方法可以验证 AWS Step Functions 中的参数

【问题讨论】:

    标签: amazon-web-services error-handling runtime-error aws-step-functions aws-step-config


    【解决方案1】:

    您的状态机需要以下输入:

    "Parameters": {
      "body": {
        "itemID.$": "$.itemID",
        "functionName.$": "$.stepFunctionName ",
        "executionARN.$": "$$.Execution.Id",
        "complete": false,
        "inprogress": true,
        "error": false
      }
    },
    

    您需要在开始新的执行时传递它们,而不是:

    {
      "Comment": "Insert your JSON here"
    }
    

    您当前正在传递的内容,因为它默认作为 AWS 控制台中新执行的输入主体。

    在此处阅读有关 InputPath 和参数的更多信息:https://docs.aws.amazon.com/step-functions/latest/dg/input-output-inputpath-params.html

    【讨论】:

      【解决方案2】:

      这也引起了我的注意。我的方案是根据 S3 ListObjectVersions 的结果设置输出,并在以后的任务中删除版本。在这种情况下,$.Versions 不存在,因为桶中没有任何东西,所以 States.Runtime 被抛出。

      {
        "bucket.$": "$.Name",
        "objects.$": "$.Versions"
      }
      

      要解决这个问题 -

      1. 我没有使用 ResultSelector 转换 ListObjectVersions 任务的结果。相反,此状态仅输出未经编辑的结果。
      2. 我在下面添加了一个Choice 状态,并带有一个规则来检查$.Versions 是否存在。
        • 如果存在,则移动到 Pass 状态并将输入转换为与我最初使用 ResultSelector 转换 ListObjectVersions 任务的结果完全相同的状态(因为Pass 状态不会在输出上转换,只有输入)。
        • 如果不存在,请移至Success 状态,因为没有可删除的内容。

      这是相关部分的屏幕截图,以防有助于可视化。

      【讨论】:

        【解决方案3】:

        来自https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html

        States.Runtime 错误是不可重试的,并且会总是导致执行失败。重试或对 States.ALL 的捕获不会捕获 States.Runtime 错误

        【讨论】:

          【解决方案4】:

          我也有同样的问题。

          我开始认为运行时错误发生在处理输入路径时,并且在捕获器可以初始化之前。这意味着无法使用 try / catch 来测试输入中存在的参数。我也尝试过 ChoiceState,但无济于事。

          所以我认为除了提供您在状态机定义中引用的每个参数之外没有其他解决方案。但是文档对此并不清楚。

          【讨论】:

            猜你喜欢
            • 2020-12-09
            • 2021-11-15
            • 1970-01-01
            • 2018-08-28
            • 1970-01-01
            • 1970-01-01
            • 2020-09-05
            • 2020-01-29
            • 1970-01-01
            相关资源
            最近更新 更多