StepFunctionのTimeoutSecondsについて

StepFunctionsの state machineのテンプレートにはTimeoutSecondsという設定を設定できます。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/sfn-stuck-execution.html

ここでは、StatesのTaskでTimeoutSecondsを指定していますが、States外でもTimeoutSecondsを指定できることがわかりました。ただ、自分が想定した動作とちょっと違ったです。

 

最初に想定していた動作

  • Statesの外でTimeoutSecondsを指定している場合は、各TaskのDefaultのTimeoutSeconds設定で動作する

    • なので、TaskにTimeoutSecondsが書かれてなくでも指定された時間にタイムアウトが起きる
  • 両方書かれている場合は、Task内の時間が優先される

     

実際の動作

動作確認コート

以下のようなStepFuncionsのState machine定義があるとします。

{
  "Comment": "A Hello World example of the Amazon States Language using Pass states",
  "StartAt": "Invoke_Lambda1",
  "TimeoutSeconds": 100,
  "States": {
    "Invoke_Lambda1": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:myTestFunction:$LATEST",
        "Payload": {
          "Input.$": "$"
        }
      },
      "Next": "Invoke_Lambda2",
      "TimeoutSeconds": 60
    },
    "Invoke_Lambda2": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:myTestFunction:$LATEST",
        "Payload": {
          "Input.$": "$",
          "TaskToken.$": "$$.Task.Token"
        }
      },
      "End": true
    }
  }
}
  • Statesの外のTimeoutSecondsは100秒に設定

  • 2つのLambda関数Task(同じ関数だけど)が実行される

    • Invoke_Lambda1はTimeoutSecondsが60秒

    • Invoke_Lambda2はTimeoutSecondsは未設定で、waitForTaskTokenで実行したままTokenが返ってくるまで待つので、ずっと実行されている状態になる

      • 最終的にこのState machineの実行がTimeoutになる

       

結果

例えば、Invoke_Lambda1の実行に50秒かかりました。Invoke_Lambda2でTimeoutされるのは何秒になるんでしょうか。想定なら50秒+100秒(未設定のTaskにデフォルトで適用)で150秒なると思っていました。

しかし、実際に実行してみると上記のState machineを実行すると100秒でTimeoutになります。Stateの外に書くTimeoutSecondsはState machineの全体の実行時間を指していることがわかりました。まあ、よく考えるとデフォルト値よりは全体の実行時間と思うのが自然な気がしますね…。

 

まとめ

  • StepFuncionsのTimeoutSecondsはStatesの外とStatesのTaskの中に書ける

    • Statesの外に書くTimeoutSecondsはState machineの全体の実行時間を指す
    • Taskの中に書くTimeoutSecondsはTaskの実行時間を定義する
  • Taskに何も書かないとずっと実行中でタスクの終了を待つことになる

 

蛇足

Popular Posts

CloudWatch EventsはAmazon EventBridgeになるらしい

PythonのDict型をDynamoDB形式のJsonに変換する

CloudFormationテンプレート内のStep functionsのState machine定義をS3に置けるようになった