【问题标题】:Break an map loop execution in AWS step functions在 AWS 步骤函数中中断地图循环执行
【发布时间】:2021-11-20 20:55:18
【问题描述】:

我正在尝试构建一个带有循环(映射)的步进函数,只要抛出特定的错误,就可以停止该函数,就像这样

        "Job": {
          "Type": "Map",
          "InputPath": "$.content",
          "ItemsPath": "$.data",
          "MaxConcurrency": 0,
          "Iterator": {
            "StartAt": "Validate",
            "States": {
              "Validate": {
                "Type": "Task",
                "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ship-val",
                "Catch": [
                    {
                      "ErrorEquals": [
                        "ErrorOne"
                      ],
                      "Next": "BreakLoop"
                    },
                    {
                      "ErrorEquals": ["States.ALL"],
                      "Next": "FailUncaughtError"
                    }
                ],
              },
              "FailUncaughtError":{
                "Type": "Fail",
                "Error": "Uncaught error"
              },
              "BreakLoop":{
                "Type": "Fail",
                "Error": "the loop should be stopped"
              }
            }
          },
          "ResultPath": "$.content.data",
          "End": true
        }

我试图将CatchNext 元素设置为地图之外的状态,但我不能,因为地图只接受其中的状态。此外,AFAIK 在 AWS 文档中没有提到这样的功能

【问题讨论】:

    标签: amazon-web-services aws-step-functions aws-state-machine


    【解决方案1】:

    与其在 Map 状态中捕获错误,不如不要捕获它并让 Map 状态失败。 并在 Map 状态中添加一个 catch,如果错误等于您要查找的错误,则继续下一步:

    {
      "StartAt": "Map",
      "States": {
        "Map": {
          "Type": "Map",
          "ItemsPath": "$.array",
          "Iterator": {
            "StartAt": "FaultyLambda",
            "States": {
              "FaultyLambda": {
                      "Type": "Task",
                      "Resource": "arn:aws:states:::lambda:invoke",
                      "Parameters": {
                        "FunctionName": "your function arn",
                        "Payload": {
                          "a": 1
                        }
                      },
                      "End": true
                    }
            }
          },
          "Catch": [
            {
              "ErrorEquals": ["ErrorOne"],
              "Next": "BreakLoop"
            }
          ],
          "Next": "BreakLoop"
        },
        "BreakLoop": {
          "Type": "Pass",
          "End": true
        }
      }
    }
    

    任何其他错误都不会被捕获并导致您的整个执行失败。

    【讨论】:

      猜你喜欢
      • 2020-02-06
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      相关资源
      最近更新 更多