🦟

AWS Step Functions の入出力処理について整理

はじめに

こんにちは。D2C データサイエンティストの仲山です。

Step Functionsを業務で初めて使用することになったとき、1番理解に時間がかかったのが入出力処理でした。
それぞれがどのような役割を持っているのかがわからず、想定通りの動き方をさせることに時間がかかりました。
そこで今回は実際にステートマシンを実行しながら、それぞれの機能について動作や役割を整理したいと思います。

Step Functionsでは、ステートへの入出力処理に主に以下を使用します。
・InputPath
・OutputPath
・Parameters
・ResultPath

整理する方法としては、Passタイプのステートにある情報を入力した時に、どのような出力結果が出てくるのかを確認していきます。
ステートへの入力情報には、下記を使用します。

ステートへの入力情報
{
    "AAA": "BBB",
    "XXX":{
        "YYY":"ZZZ"
    }
  }

InputPath

InputPathはステートへの入力情報をフィルタリングします。
"$"と記載するとデフォルトの動作をし、デフォルトの場合は全ての入力情報を次の処理へ渡します。

Amazonステートメント言語 | InputPath①
{
  "InputPath": "$"
}

上記のようにInputPathをデフォルトで実行すると、下記の通りステートへの入力情報全てをステートから出力します。

ステートからの出力情報 | InputPath①
{
  "AAA": "BBB",
  "XXX": {
    "YYY": "ZZZ"
  }
}

InputPathで特定のキーを指定すると、指定した情報のみにフィルタリングされます。

Amazonステートメント言語 | InputPath②
{
  "InputPath": "$.XXX"
}

実行結果は下記の通りです。

ステートからの出力情報 | InputPath②
{
  "YYY": "ZZZ"
}

OutputPath

OutputPathはステートへの出力情報をフィルタリングします。
InputPathと同じく、デフォルト動作の場合は全ての情報をステートから出力します。

Amazonステートメント言語 | OutputPath①
{
  "InputPath": "$",
  "OutputPath": "$"
}

実行結果は下記の通りです。

ステートからの出力情報 | OutputPath①
{
  "AAA": "BBB",
  "XXX": {
    "YYY": "ZZZ"
  }
}

特定の情報のみを出力したい場合は、キーを指定します。

Amazonステートメント言語 | OutputPath②
{
  "InputPath": "$",
  "OutputPath": "$.XXX"
}

出力情報は下記の通りです。

ステートからの出力情報 | OutputPath②
{
  "YYY": "ZZZ"
}

Parameters

Parametersではステートの中で新たなキーとバリューのペアを定義することができます。

Amazonステートメント言語 | Parameters①
{
  "InputPath": "$",
  "Parameters": {
    "CCC": "DDD"
  },
  "OutputPath": "$"
}

Parametersの中で新たに"CCC": "DDD"を定義して実行すると、出力結果は下記のようになります。

ステートからの出力情報 | Parameters①
{
  "CCC": "DDD"
}

このように最初にステートへ入力した情報は出力されず、Parametersで定義した値が出力されます。
そのため、最初に入力した情報をステートから出力したい場合は後述するResultPathを使用する必要があります。

また、Parametersではステートに入力した情報を用いることができます。

Amazonステートメント言語 | Parameters②
{
  "InputPath": "$",
  "Parameters": {
    "Input_AAA.$": "$.AAA",
    "CCC": "DDD"
  },
  "OutputPath": "$"
}

上記ステートでの実行結果は下記の通りです。

ステートからの出力情報 | Parameters②
{
  "CCC": "DDD",
  "Input_AAA": "BBB"
}

ResultPath

ResultPathはステートへ出力する情報を選択することができます。
ResultPathの値に$.任意の文字列と入力すると、ステートへの入力情報とParametersによる出力情報の両方をステートから出力します。

Amazonステートメント言語 | ResultPath①
{
  "InputPath": "$",
  "Parameters": {
    "CCC": "DDD"
  },
  "ResultPath": "$.result",
  "OutputPath": "$"
}

上記ステートからの出力情報は下記の通りです。
Parametersの出力情報はresultの中に入っています。

ステートからの出力情報 | ResultPath①
{
  "AAA": "BBB",
  "XXX": {
    "YYY": "ZZZ"
  },
  "result": {
    "CCC": "DDD"
  }
}

デフォルト動作である"ResultPath": "$"とした場合、ステートへの入力情報は破棄されParametersの出力結果のみが、ステートからの出力結果になります。

ステートからの出力情報 | ResultPath②
{
  "CCC": "DDD"
}

"ResultPath": nullとした場合、Parametersの出力結果が破棄され、ステートへの入力情報がステートからの出力結果になります。

ステートからの出力情報 | ResultPath③
{
  "AAA": "BBB",
  "XXX": {
    "YYY": "ZZZ"
  }
}

おわりに

今回はStep Functionsの入出力処理について実際に実行してみながら、動作や役割を確認しました。

入出力処理 役割
InputPath ステートへの入力情報をフィルタリングする
OutputPath ステートへの出力情報をフィルタリングする
Parameters ステートの中で新たなキーとバリューのペアを定義する
ResultPath ステートから出力する情報を選択する

今回整理した入出力処理は実装する上で、基礎的な部分になります。
改めて基礎的な部分を整理できたことで、今後の業務ではよりスムーズにStep Functionsを実装できそうだと感じました。
今後も業務でStep Functionsを使用する場面は多々ありそうなので、勉強していきたいと思います。

参考

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-input-output-filtering.html
https://dev.classmethod.jp/articles/stepfunctions-parameters-inter-states/

D2C m-tech

Discussion