AWS Step Functionsでは、直接的な計算を実行する機能はありませんが、Lambda関数を使うことなく値をインクリメントするための単純な Pass ステートを利用する場合は、Parameters を使って値を操作します。これにより、特定のキーに対して加算を行い、新しい値を設定することが可能になります。この場合、一時的な変数を使用する方法で設定できます。
以下に、InitializeState の結果を次の Pass ステートでインクリメントする方法を説明します:
ステートマシンの構造
InitializeState: 初期変数を設定するPassステートIncrementState: 変数の値をインクリメントするPassステートChoiceState: インクリメントした変数に基づいて条件分岐を行うChoiceステート
ステートマシンの定義
{
"Comment": "State machine to pass values through Pass and Choice states with incrementation",
"StartAt": "InitializeState",
"States": {
"InitializeState": {
"Type": "Pass",
"Result": {
"variable": 42,
"status": "initialized"
},
"ResultPath": "$.initData",
"Next": "IncrementState"
},
"IncrementState": {
"Type": "Pass",
"Parameters": {
"variable.$": "States.JsonToJmesPath(@.initData.variable + 1)", // 式評価でインクリメント
"status.$": "$.initData.status"
},
"ResultPath": "$.initData",
"Next": "ChoiceState"
},
"ChoiceState": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.initData.variable",
"NumericGreaterThanEquals": 50,
"Next": "SuccessPass"
},
{
"Variable": "$.initData.variable",
"NumericLessThan": 50,
"Next": "FailurePass"
}
],
"Default": "FailurePass"
},
"SuccessPass": {
"Type": "Pass",
"Result": {
"message": "Success: Value is greater than or equal to 50"
},
"ResultPath": "$.resultData",
"End": true
},
"FailurePass": {
"Type": "Pass",
"Result": {
"message": "Failure: Value is less than 50"
},
"ResultPath": "$.resultData",
"End": true
}
}
}
説明
InitializeState:
Passステートで{ "variable": 42, "status": "initialized" }を出力します。ResultPathを使用して$.initDataに保存。- 次のステートとして
IncrementStateに遷移。
IncrementState:
- この
Passステートで、値をインクリメントします。 Parametersを使用して、States.JsonToJmesPath(@.initData.variable + 1)式評価によりvariableの値を 42 から 43 に増加させます。- 結果を再び
$.initDataに保存し、次のステートとしてChoiceStateに遷移。
ChoiceState:
- 増加された
variableの値(43)に基づいて条件分岐します。 - 値が 50 以上であれば
SuccessPassステートに遷移。 - 値が 50 未満であれば
FailurePassステートに遷移。
SuccessPass:
- 成功メッセージを設定し、ステートマシンを終了。
FailurePass:
- 失敗メッセージを設定し、ステートマシンを終了。
注意点
States.JsonToJmesPathを使う方法はAWS Step Functionsのコンテキスト内での式評価の一例です。これはすべてのケースでサポートされているわけではないため、複雑な計算が必要な場合は、やはりLambda関数を使う方法を検討することをお勧めします。
まとめ
上記の例は、値をインクリメントするために Parameters を利用することに焦点を当てたものです。もしより複雑な操作が必要な場合は、Step Functionsの Task ステートとAWS Lambdaの併用を検討してください。これは柔軟性を持たせるために不可欠な手法です。

コメント