AWS Step Functionsの実行時パラメーターにデフォルト値を設定する

AWS Step Functionsの実行について、入力のデフォルト値を設定する方法を試してみました。
2023.09.26

こんにちは。サービス開発室の武田です。

AWS Step Functionsのステートマシンを実行する際、入力として値を渡せます。

さてプログラムのAPIやRESTful APIなど、引数を取るものはデフォルト値が設定されているものが多くあります。やはりステートマシンの実行でもデフォルト値、欲しいですよね?なんとかして実現しましょう。

やり方はいくつかありそうです。(他にもあるかもですが)候補は次の3つ。

  1. Lambda関数でデフォルト値をセットするロジックを実装する
  2. Choiceステートを使用して、値がなかった場合にセットするステートマシンを構築する
  3. States.JsonMerge関数を使用して、デフォルト値をセットするステートマシンを構築する

この中で3が実装コスト、シンプルさともに優れていそうです。そんなわけでやってみました。

States.JsonMerge関数とは

実装の前に、件の関数について知っておきましょう。States.JsonMerge関数は、JSONデータを2つ引数に取り、それらをマージする関数です。引数は3つです。

States.JsonMerge(json1, json2, deepmerge_mode)

json1json2を被せるようなイメージです。つまり同名のキーが存在した場合、json2のデータが残ります。第3引数はデータがJSONの場合の挙動を指定します(ディープマージモード)。現状(2023-09-26時点)ではシャローマージしかサポートしていないため、指定は常にfalseです。

やってみた

それでは実際にステートマシンを構築して、動作確認をしてみましょう。実行の入力のうち、regionserviceについては次のようにデフォルト値を設けたいとします。

  • region: ap-northeast-1
  • service: stepfunctions

今回組んだステートマシンは次のようなものです。

{
  "Comment": "A description of my state machine",
  "StartAt": "Define Default Parameter",
  "States": {
    "Define Default Parameter": {
      "Type": "Pass",
      "Next": "Merge Parameter",
      "Result": {
        "region": "ap-northeast-1",
        "service": "stepfunctions"
      }
    },
    "Merge Parameter": {
      "Type": "Pass",
      "Next": "Success",
      "Parameters": {
        "args.$": "States.JsonMerge($, $$.Execution.Input, false)"
      },
      "OutputPath": "$.args"
    },
    "Success": {
      "Type": "Succeed"
    }
  }
}

グラフィカルに表示させたものが次のものです。

このように、Passステートだけで実現できるのがポイントですね。分岐などもなくシンプルです。

Define Default ParameterResultでデフォルト値を定義しています。これが次のステートの入力になります。

続くMerge ParameterParametersで、先ほどの値と$$.Execution.Inputをマージしています。$$.Execution.Inputとは、このステートマシン実行の入力です。マージした値を一度argsというキーに設定し、その後OutputPathで取り出しています。

最後のSucceedは確認用で、特に意味はありません。

それでは動作確認してみましょう。

regionserviceを指定した場合。

regionだけ指定した場合。

serviceだけ指定した場合。

どちらも省略した場合。

うまく動いてますね!

まとめ

ステートマシンを実行する際の入力について、デフォルト値を設定したい時の方法を試してみました。Passステートを追加するだけで実現できますので、ぜひ試してみてください。