9
3

More than 1 year has passed since last update.

StepFunctions ステートマシン同期実行の挙動

Posted at

はじめに

StepFunctionsを用いた開発を行う中で、ステートマシンの同期実行の挙動で気になった点があったので、検証してみた。今回はその検証結果をまとめる。

ステートマシンの同期実行方法

以下のように呼び出したいステートマシンを startExecution.sync:2 で呼び出し、Parameterinput"AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$": "$$.Execution.Id" を入れることで、簡単にステートマシンを同期実行することができる。


{
  "Comment": "A description of my state machine",
  "StartAt": "test1",
  "States": {
    "test1": {
      "Type": "Task",
      "Resource": "arn:aws:states:::states:startExecution.sync:2",
      "Parameters": {
        "StateMachineArn": "arn:aws:states:{Region}:{AccountID}:stateMachine:{StateMachineName}",
        "Input": {
          "AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$": "$$.Execution.Id"
        }
      },
      "End": true
    }
  }
}

呼び出したステートマシンが失敗した場合

以下のようなステートマシンを呼び出し、呼び出された側のステートマシンが失敗したときの呼び出し元ステートマシンの挙動を調べてみる。

image.png


{
  "Comment": "A description of my state machine",
  "StartAt": "Wait",
  "States": {
    "Wait": {
      "Type": "Wait",
      "Seconds": 5,
      "Next": "Fail"
    },
    "Fail": {
      "Type": "Fail"
    }
  }
}

実行後

呼び出されたステートマシン

image.png

呼び出し元ステートマシン

image.png

実行結果より、呼び出されたステートマシンが失敗すると、呼び出し元ステートマシンもそれに伴って失敗することがわかる。

並列に2つのステートマシンを呼び出し、一方が失敗した場合

次に、上で呼び出したステートマシンに加えて、以下のようなステートマシンを並列に呼び出し、一方が失敗した場合、もう一方のステートマシンと呼び出し元ステートマシンの挙動を調査してみる。

image.png


{
  "Comment": "A description of my state machine",
  "StartAt": "Wait",
  "States": {
    "Wait": {
      "Type": "Wait",
      "Seconds": 30,
      "End": true
    }
  }
}

呼び出し元ステートマシン構成

image.png


{
  "Comment": "A description of my state machine",
  "StartAt": "Parallel",
  "States": {
    "Parallel": {
      "Type": "Parallel",
      "End": true,
      "Branches": [
        {
          "StartAt": "test1",
          "States": {
            "test1": {
              "Type": "Task",
              "Resource": "arn:aws:states:::states:startExecution.sync:2",
              "Parameters": {
                "StateMachineArn": "arn:aws:states:{Region}:{AccountID}:stateMachine:{StateMachineName}",
                "Input": {
                  "AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$": "$$.Execution.Id"
                }
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "test2",
          "States": {
            "test2": {
              "Type": "Task",
              "Resource": "arn:aws:states:::states:startExecution.sync:2",
              "Parameters": {
                "StateMachineArn": "arn:aws:states:{Region}:{AccountID}:stateMachine:{StateMachineName}",
                "Input": {
                  "AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$": "$$.Execution.Id"
                }
              },
              "End": true
            }
          }
        }
      ]
    }
  }
}

呼び出されたステートマシン(意図的に失敗させた方)

image.png

もう一方の呼び出されたステートマシン

image.png

呼び出し元ステートマシン

image.png

実行結果より、呼び出されたステートマシンが1つでも失敗してしまうと、他の呼び出されたステートマシンは実行がキャンセルされてしまい、呼び出し元ステートマシンも失敗扱いとなってしまうようである。

まとめ

ステートマシンを同期的に呼び出した際、1つのステートマシンが失敗してしまうと、他の呼び出されたステートマシンや呼び出し元ステートマシンの実行も中断されてしまうため、注意が必要である。
これらを回避するためには、同期的に呼び出すのではなく、非同期的に呼び出す(コールバックを待つなど)のが賢明でありそう。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3