はじめに
本記事はStep Functionsで提供されているデータフローシミュレーターの紹介記事のようなものです。
InputPath
、Parameters
、ResultSelector
、OutputPath
、ResultPath
などの説明は概要程度であり、より詳しい情報は他で参照ください。
Step Functions初心者の頃はステートマシンの入出力制御つまりInputPath
、Parameters
、ResultSelector
、OutputPath
、ResultPath
がどのような役割を果たしているのか理解に苦労しました。
以下のように丁寧にまとめてくださっている資料もありますが、実際に手を動かして確認する方が理解が早く感じます。
ステートマシンを動かせば、入出力制御の結果を確認することができますが、以下のようなデメリットがあります。
- 処理時間が長いステートマシンの場合、確認に時間がかかり、開発効率が下がったり、コストもかかる
- 入出力制御の設定を複数定義していた場合、それぞれがどのように関連して最終的な入力、出力を生成したのかがわかりにくい
データフローシミュレーターとは
先ほぼ書いたデメリットを解決する機能がデータフローシミュレーター
です。
これを使用することでInputPath
、Parameters
、ResultSelector
、OutputPath
、ResultPath
の各設定をステートマシンを実行せずにシミュレーションすることができます。
それぞれの設定の適用前、適用後のデータを並べて確認することができ、設定の学習はもちろん開発する際も役に立つ機能だと思います。
ちなみに、この機能は2021年4月頃に追加されました。
Step Functionsの管理コンソールに遷移していただき、左メニューのデータフローシミュレーター
を選択するとすぐに使用することができます。
シナリオ
注意
データフローシミュレーターを試すため冗長な設計となっております。ご了承ください。
今回は架空のシナリオをベースにデータフローシミュレーターを使用してみます。
そして、ステートに設定する各入出力制御を確認してみたいと思います。
以下、シナリオです。
- S3バケットにオブジェクトをアップロードしたらステートマシンを実行する
- ステートマシンにはPassステートとS3のGetObjectステートを配置する
- Passステートでは、S3のObject CreatedイベントのJsonがEventBridgeから渡される。Jsonを後続のGetObjectステートで使いやすいよう加工し、出力する
- GetObjectステートでは、Passステートの出力をAPIパラメータに渡し、処理を実行する。出力は以下の形式とする
{
"name": "ファイルをアップロードしたS3バケット名",
"key": "アップロードしたオブジェクトのキー",
"result": {
"file_text": "ファイル内に記載されている文字列"
}
}
ステートマシンの状態は現在以下のようにしており、InputPath
、Parameters
、ResultSelector
、OutputPath
は指定していません。
処理に必要なステートをドラッグ&ドロップした直後の状態です。
データフローシミュレーターを使用し、どのような値を指定していけばいいのかTry&Errorしていきましょう。
Passステート
最初にPassステートについて確認してみます。
State Input
まず、Stete Input
にステートの入力となるJsonを入力します。
今回は、EventBridgeのS3 Object Createdイベントが入力となります。
EventBridgeにはサンドボックス
とう機能があり、イベントパターンのテストやイベント発生時のJsonを確認することができます。
EventBridge管理コンソール左メニューのサンドポックス
を選択し、スクショのように入力すると今回入力となるJsonのサンプルが出力されます。
これをコピーし、State Input
に入力してください。
{
"version": "0",
"id": "17793124-05d4-b198-2fde-7ededc63b103",
"detail-type": "Object Created",
"source": "aws.s3",
"account": "123456789012",
"time": "2021-11-12T00:00:00Z",
"region": "ca-central-1",
"resources": ["arn:aws:s3:::example-bucket"],
"detail": {
"version": "0",
"bucket": {
"name": "example-bucket"
},
"object": {
"key": "example-key",
"size": 5,
"etag": "b1946ac92492d2347c6235b4d2611184",
"version-id": "IYV3p45BT0ac8hjHg1houSdS1a.Mro8e",
"sequencer": "00617F08299329D189"
},
"request-id": "N4N7GDK58NMKJ12R",
"requester": "123456789012",
"source-ip-address": "1.2.3.4",
"reason": "PutObject"
}
}
InputPath
続いて、InputPath
で入力Jsonのフィルタリングを行います。
後続のGetObject
ステートのAPIパラメータは以下であり、入力のdetail
オブジェクトのみ取得すればよさそうです。
{
"Bucket": "MyData",
"Key": "MyData"
}
入力欄に$.detail
と入力するとフィルタリング前と後の結果が出力されます。
Parameters
続いて、Parameters
です。
先ほど説明したGetObject
ステートのAPIパラメータの情報のみ取得したいので、入力欄は以下のようにします。
{
"name.$": "$.bucket.name",
"key.$": "$.object.key"
}
Task Result、ResultSelector
ResultSelector
はPassステートに設定できないため、Task Result
、ResultSelector
は未設定で次に進みます。
ResultPath、OutputPath
必要な情報は前段で出力されているのでResultPath
も今回未設定にします。
また、これ以上特に情報の追加などは必要ないため、OutputPath
も未設定にします。
State Output
State Output
で最終的なステートの出力を確認することができます。
想定通りであれば、今までの設定を実際のステートに反映させてください。
GetObjectステート
GetObject
ステートもPass
ステートと同様の流れで確認していきます。
State Input
GetObject
ステートの入力は前段Pass
ステートの出力になります。
以下のJsonを入力してください。
{
"name": "example-bucket",
"key": "example-key"
}
InputPath、Parameters
すでにGetObject
ステートのAPIパラメータに指定する情報は入力Jsonに含まれているため、InputPath
、Parameters
の指定は不要です。
Task Result
Task Result
はTask
タイプのステートが実行された後に出力されるJsonを入力する箇所です。Lambda関数の戻り値(LambdaのInvokeステート)などを入力します。
どのステートがどのような形式のレスポンスを返すかは公式ドキュメントなど確認しましたが、わかりませんでした。
こちらについては一度当該ステートを実行して確かめる必要がありそうです
GetObject
ステートの実際のレスポンスは以下になります。(一部中略)
これをTask Result
の入力欄に貼り付けてください。
{
"AcceptRanges": "bytes",
"ContentLength": 30,
"ContentType": "text/plain",
"ETag": "\"xxxxxxxxxxxxxxxxxxxxxxxx\"",
"Body":"おはようございます!"
}
ResultSelector
ResultSelector
はParameters
と似ています。
Task Result
の結果から新たな形式のJsonを構築し、ResultPath
に渡します。
今回は以下のJsonを指定します。最終的に出力するtext
属性を持つJsonです。
{
"text.$": "$.Body"
}
ResultPath
ResultPath
では、ステートの入力にResultSelector
の結果を追加する設定をします。
今回は$.result
を指定します。
※本当はname
、key
属性と同階層にtext
を配置したかったですが、調べた限りGetObject
ステートの後にもう一つPass
ステートを追加し、Jsonを変換する処理を噛ませるようなことをしないとできなさそうです。
OutputPath
すでに前段で想定のJsonになっているため、OutputPath
は指定しません。
State Output
出力が想定通りか確認してください。
おわりに
以上で説明はおわりとなります。
データフローシミュレーターの有用性をご理解いただけたら幸いです。