0
0

More than 1 year has passed since last update.

Step Functions データフローシミュレーターでステートの入出力設定を理解する

Posted at

はじめに

本記事はStep Functionsで提供されているデータフローシミュレーターの紹介記事のようなものです。
InputPathParametersResultSelectorOutputPathResultPathなどの説明は概要程度であり、より詳しい情報は他で参照ください。

Step Functions初心者の頃はステートマシンの入出力制御つまりInputPathParametersResultSelectorOutputPathResultPathがどのような役割を果たしているのか理解に苦労しました。
以下のように丁寧にまとめてくださっている資料もありますが、実際に手を動かして確認する方が理解が早く感じます。

ステートマシンを動かせば、入出力制御の結果を確認することができますが、以下のようなデメリットがあります。

  • 処理時間が長いステートマシンの場合、確認に時間がかかり、開発効率が下がったり、コストもかかる
  • 入出力制御の設定を複数定義していた場合、それぞれがどのように関連して最終的な入力、出力を生成したのかがわかりにくい

データフローシミュレーターとは

先ほぼ書いたデメリットを解決する機能がデータフローシミュレーターです。
これを使用することでInputPathParametersResultSelectorOutputPathResultPathの各設定をステートマシンを実行せずにシミュレーションすることができます。
それぞれの設定の適用前、適用後のデータを並べて確認することができ、設定の学習はもちろん開発する際も役に立つ機能だと思います。
ちなみに、この機能は2021年4月頃に追加されました。

Step Functionsの管理コンソールに遷移していただき、左メニューのデータフローシミュレーターを選択するとすぐに使用することができます。

スクリーンショット 2023-08-05 19.24.26.png

シナリオ

注意
データフローシミュレーターを試すため冗長な設計となっております。ご了承ください。

今回は架空のシナリオをベースにデータフローシミュレーターを使用してみます。
そして、ステートに設定する各入出力制御を確認してみたいと思います。
以下、シナリオです。

  • S3バケットにオブジェクトをアップロードしたらステートマシンを実行する
  • ステートマシンにはPassステートとS3のGetObjectステートを配置する
    • Passステートでは、S3のObject CreatedイベントのJsonがEventBridgeから渡される。Jsonを後続のGetObjectステートで使いやすいよう加工し、出力する
    • GetObjectステートでは、Passステートの出力をAPIパラメータに渡し、処理を実行する。出力は以下の形式とする
{
  "name": "ファイルをアップロードしたS3バケット名",
  "key": "アップロードしたオブジェクトのキー",
  "result": {
    "file_text": "ファイル内に記載されている文字列"
  }
}

ステートマシンの状態は現在以下のようにしており、InputPathParametersResultSelectorOutputPathは指定していません。
処理に必要なステートをドラッグ&ドロップした直後の状態です。
データフローシミュレーターを使用し、どのような値を指定していけばいいのかTry&Errorしていきましょう。

スクリーンショット 2023-08-05 14.56.29.png

Passステート

最初にPassステートについて確認してみます。

State Input

まず、Stete Inputにステートの入力となるJsonを入力します。
今回は、EventBridgeのS3 Object Createdイベントが入力となります。
EventBridgeにはサンドボックスとう機能があり、イベントパターンのテストやイベント発生時のJsonを確認することができます。

EventBridge管理コンソール左メニューのサンドポックスを選択し、スクショのように入力すると今回入力となるJsonのサンプルが出力されます。
これをコピーし、State Inputに入力してください。

screencapture-ap-northeast-1-console-aws-amazon-events-home-2023-08-05-21_24_47.png

{
  "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"
  }
}

スクリーンショット 2023-08-05 21.34.42.png

InputPath

続いて、InputPathで入力Jsonのフィルタリングを行います。
後続のGetObjectステートのAPIパラメータは以下であり、入力のdetailオブジェクトのみ取得すればよさそうです。

{
  "Bucket": "MyData",
  "Key": "MyData"
}

入力欄に$.detailと入力するとフィルタリング前と後の結果が出力されます。

スクリーンショット 2023-08-05 21.39.10.png

Parameters

続いて、Parametersです。
先ほど説明したGetObjectステートのAPIパラメータの情報のみ取得したいので、入力欄は以下のようにします。

{
  "name.$": "$.bucket.name",
  "key.$": "$.object.key"
}

screencapture-ap-northeast-1-console-aws-amazon-states-home-2023-08-05-21_47_46.png

Task Result、ResultSelector

ResultSelectorはPassステートに設定できないため、Task ResultResultSelectorは未設定で次に進みます。

スクリーンショット 2023-08-05 21.51.37.png

スクリーンショット 2023-08-05 21.52.15.png

ResultPath、OutputPath

必要な情報は前段で出力されているのでResultPathも今回未設定にします。
また、これ以上特に情報の追加などは必要ないため、OutputPathも未設定にします。

スクリーンショット 2023-08-05 21.57.13.png

スクリーンショット 2023-08-05 21.58.51.png

State Output

State Outputで最終的なステートの出力を確認することができます。
想定通りであれば、今までの設定を実際のステートに反映させてください。

スクリーンショット 2023-08-05 21.59.03.png

GetObjectステート

GetObjectステートもPassステートと同様の流れで確認していきます。

State Input

GetObjectステートの入力は前段Passステートの出力になります。
以下のJsonを入力してください。

{
  "name": "example-bucket",
  "key": "example-key"
}

スクリーンショット 2023-08-05 22.18.21.png

InputPath、Parameters

すでにGetObjectステートのAPIパラメータに指定する情報は入力Jsonに含まれているため、InputPathParametersの指定は不要です。

スクリーンショット 2023-08-05 22.18.37.png

スクリーンショット 2023-08-05 22.18.54.png

Task Result

Task ResultTaskタイプのステートが実行された後に出力されるJsonを入力する箇所です。Lambda関数の戻り値(LambdaのInvokeステート)などを入力します。
どのステートがどのような形式のレスポンスを返すかは公式ドキュメントなど確認しましたが、わかりませんでした。
こちらについては一度当該ステートを実行して確かめる必要がありそうです
GetObjectステートの実際のレスポンスは以下になります。(一部中略)
これをTask Resultの入力欄に貼り付けてください。

{
  "AcceptRanges": "bytes",
  "ContentLength": 30,
  "ContentType": "text/plain",
  "ETag": "\"xxxxxxxxxxxxxxxxxxxxxxxx\"",
  "Body":"おはようございます!"
}

a

ResultSelector

ResultSelectorParametersと似ています。
Task Resultの結果から新たな形式のJsonを構築し、ResultPathに渡します。
今回は以下のJsonを指定します。最終的に出力するtext属性を持つJsonです。

{
  "text.$": "$.Body"
}

スクリーンショット 2023-08-05 23.06.55.png

ResultPath

ResultPathでは、ステートの入力にResultSelectorの結果を追加する設定をします。
今回は$.resultを指定します。
※本当はnamekey属性と同階層にtextを配置したかったですが、調べた限りGetObjectステートの後にもう一つPassステートを追加し、Jsonを変換する処理を噛ませるようなことをしないとできなさそうです。

スクリーンショット 2023-08-05 23.07.52.png

OutputPath

すでに前段で想定のJsonになっているため、OutputPathは指定しません。

スクリーンショット 2023-08-05 23.35.22.png

State Output

出力が想定通りか確認してください。

スクリーンショット 2023-08-05 23.36.11.png

おわりに

以上で説明はおわりとなります。
データフローシミュレーターの有用性をご理解いただけたら幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0