【问题标题】:AWS Step Function - stop State machine execution on a conditionAWS Step Function - 在条件下停止状态机执行
【发布时间】:2021-11-10 21:04:32
【问题描述】:

我附上了我的状态机的外观,并分享了定义以供参考。 Service Status Retry Wait 状态在调用 Service Status Retry 状态之前等待 60 秒,该状态调用 lambda 来检查服务是否在 Service Created? 状态下创建。

{
  "Comment": "Step Function for Deployment",
  "StartAt": "Start",
  "States": {
    "Start": {
      "Type": "Pass",
      "Next": "Service Status"
    },
    "Service Status": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "Service Status Check",
          "States": {
            "Service Status Check": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "FunctionName": "arn:aws:lambda:us-west-2:<acc-id>:function:<fn-name>",
                "Payload": {
                  "stepFunctionState.$": "$$.State.Name",
                  "requestContext": {
                    "stepFunction": true,
                    "accountId": "<acc-id>"
                  },
                  "resource.$": "States.Format('{}/srvc', $$.Execution.Input.resource)",
                  "path.$": "States.Format('{}/srvc', $$.Execution.Input.path)",
                  "httpMethod": "POST",
                  "pathParameters.$": "$$.Execution.Input.pathParameters",
                  "body.$": "$$.Execution.Input.body",
                  "isBase64Encoded": false,
                  "headers": {},
                  "queryStringParameters": null
                }
              },
              "ResultPath": "$.taskresult",
              "Next": "Service Created?"
            },
            "Service Created?": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.taskresult.Payload.body",
                  "StringMatches": "*\"isCreated\": \"false\"*",
                  "Next": "Service Status Retry Wait"
                },
                {
                  "Variable": "$.taskresult.Payload.body",
                  "StringMatches": "*\"isCreated\": \"true\"*",
                  "Next": "Service Status Check End"
                }
              ],
              "Default": "Service Status Retry Wait"
            },
            "Service Status Retry Wait": {
              "Type": "Wait",
              "Seconds": 60,
              "Next": "Service Status Retry"
            },
            "Service Status Retry": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "FunctionName": "arn:aws:lambda:us-west-2:<acc-id>:function:<func-name>",
                "Payload": {
                  "stepFunctionState.$": "$$.State.Name",
                  "requestContext": {
                    "stepFunction": true,
                    "accountId": "<acc-id>"
                  },
                  "resource.$": "States.Format('{}/srvc', $$.Execution.Input.resource)",
                  "path.$": "States.Format('{}/srvc', $$.Execution.Input.path)",
                  "httpMethod": "POST",
                  "pathParameters.$": "$$.Execution.Input.pathParameters",
                  "body.$": "$$.Execution.Input.body",
                  "isBase64Encoded": false,
                  "headers": {},
                  "queryStringParameters": null
                }
              },
              "ResultPath": "$.taskresult",
              "Next": "Service Created?"
            },
            "Service Status Check End": {
              "Type": "Pass",
              "End": true
            }
          }
        }
      ],
      "Next": "End"
    },
    "End": {
      "Type": "Pass",
      "End": true
    }
  }
}

直到和除非服务被创建,这个状态机一直在循环中进行。我想知道是否有办法在重试 5 次后打破循环并退出。它可以在 Service Status Retry WaitService Status Retry 被调用 5 次之后。

或者,如果有办法知道它现在已经循环了 1 小时并基于此退出。以上两个选项中的任何一个都应该适合我。

关于如何实现这一点的任何想法/想法?

【问题讨论】:

  • 看来您可以使用 Step Functions 内置的错误/重试功能,而不是为此 docs.aws.amazon.com/step-functions/latest/dg/…重新创建自己的逻辑
  • 它解释了错误后重试。但是,就我而言,我不希望出现错误。我需要在我的重试状态执行 5 次后停止。
  • 我的意思是您可以配置检查服务状态的代码,以便在服务尚未启动时抛出错误。然后,您将能够利用 Step Functions 提供的此内置重试处理功能。

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


【解决方案1】:

你有两个选择:

  1. 通过保持重试次数自行处理重试,并将其检查为您选择的状态:

  2. 使用内置错误/重试。检查是否创建了服务并抛出错误并将其包装为并行状态,重试次数为 5:

{
  "Comment": "Step Function for Deployment",
  "StartAt": "Start",
  "States": {
    "Start": {
      "Type": "Pass",
      "Next": "Service Status"
    },
    "Service Status": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "Service Status Check",
          "States": {
            "Service Status Check": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "FunctionName": "arn:aws:lambda:us-west-2:<acc-id>:function:<fn-name>",
                "Payload": {
                  "stepFunctionState.$": "$$.State.Name",
                  "requestContext": {
                    "stepFunction": true,
                    "accountId": "<acc-id>"
                  },
                  "resource.$": "States.Format('{}/srvc', $$.Execution.Input.resource)",
                  "path.$": "States.Format('{}/srvc', $$.Execution.Input.path)",
                  "httpMethod": "POST",
                  "pathParameters.$": "$$.Execution.Input.pathParameters",
                  "body.$": "$$.Execution.Input.body",
                  "isBase64Encoded": false,
                  "headers": {},
                  "queryStringParameters": null
                }
              },
              "ResultPath": "$.taskresult",
              "Next": "Service Created?"
            },
            "Service Created?": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.taskresult.Payload.body",
                  "StringMatches": "*\"isCreated\": \"false\"*",
                  "Next": "Throw Error"
                },
                {
                  "Variable": "$.taskresult.Payload.body",
                  "StringMatches": "*\"isCreated\": \"true\"*",
                  "Next": "Succeed"
                }
              ],
              "Default": "Throw Error"
            },
            "Throw Error": {
              "Type": "Fail"
            },
            "Succeed": {
              "Type": "Pass",
              "End": true
            }
          }
        }
      ],
      "Next": "End",
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 3,
          "MaxAttempts": 5,
          "BackoffRate": 1.5
        }
      ]
    },
    "End": {
      "Type": "Pass",
      "End": true
    }
  }
}

【讨论】:

    【解决方案2】:

    您可以使用重试状态来处理这种情况,并指定重试之间的等待间隔IntervalSeconds,这样您的工作流程中就不需要等待状态。以下代码最多重试五次,每次重试之间等待 60 秒。

    "Retry": [
                {
                  "ErrorEquals": [
                    "States.All"
                  ],
                  "IntervalSeconds": 60,
                  "MaxAttempts": 5,
                  "BackoffRate": 0
                }
              ],
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2019-09-07
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多