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に何も書かないとずっと実行中でタスクの終了を待つことになる
- AWS側の制限はあるので、長くても1年までですね
- https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/limits.html
蛇足
Statesの外のTimeoutSecondsでTimeoutされると結果はExecutionTimedOutとなります
Taskの中のTimeoutSecondsでTimeoutされると結果はExecutionFailedとなります
Callback Patternをサポートしたのは去年の3月なんですね。割と(?)最新のアップデートでしたね