Step Functionsの作成に役立つワークフロースタジオ上の便利機能

# はじめに
AWS Step Functionsのワークフロー作成時に知っておくと楽になるTipsの紹介をします。

Step FunctionsはAWSコンソールのワークフロースタジオ上でぽちぽち作成を行うことができますが、
設定値の記法の独特さや（以前の`JSONPath`・新しく追加された`JSONata`）、ワークフローをデバックしたい場合の方法などが作成時の悩みです。

ただ、ここ最近このあたりの使い勝手が改善しており、アップデートされて使いやすくなったワークフロースタジオの機能を紹介します。

## 便利機能
### ① JSONataのコード補完

既存のJSONPath形式に加えて、新しくクエリ言語のJSONataがサポートされました。
JSONata設定にした場合、ワークフローのエディタ上でコード補完が効くようになっています。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-step-functions-variables-jsonata-transformations/

まずはステートマシンを新規作成して、Passステートをフローに追加します。

![スクリーンショット 2024-12-31 12.41.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/8c3b04bd-cd06-8376-6178-79aa0a88fdac.png)

出力エディタに下記のようにJSONataの必須項目を記載すると、エディタ内でコード補完が効くようになります
```
"{%%}"
```

![スクリーンショット 2024-12-31 12.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/98e81f5e-dcf4-15d7-33f1-49f18c20e7c0.png)

まず、JSONata記法の起点となる`$`を入力してみます。
すると、それに続いて書けるコード候補がサジェストされるようになります。

![スクリーンショット 2024-12-31 12.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/5160293c-5004-9ed0-c115-39ece30c3225.png)

サジェスト通りstatesを選択（enter or クリック）してみましょう。
$statesの後は、`.`つなぎで記載していくため、`$states.`まで入力してみます。

![スクリーンショット 2024-12-31 12.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/1475623c-cd67-65c2-edcf-1af3f204ed82.png)

すると、input / context のサジェストが現れました。
ちなみに、inputはステートへの入力値を取得する用途で使用します。contextは、起動ステートマシンの情報を取得する用途で使用します。

（参考）inputについて

https://docs.aws.amazon.com/step-functions/latest/dg/transforming-data.html

（参考）contextについて

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/input-output-contextobject.html

`context.`まで入力し、そのサジェストで出てきた`State`を入力、さらに`.`でつないで出てきた、`EnteredTime`まで入力してみます。

![スクリーンショット 2024-12-31 13.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/3369c8f7-9c4e-c98a-5e14-f1ffe88adf8f.png)


最終的に、コード補完のお陰で、ステート処理の開始時間を参照するところまでスムーズに到達することができました。

```
"{% $states.context.State.EnteredTime %}"
```

inputも同様に、コード補完を活かして、`$states.input`まで書き進めます。inputの先は任意の入力値となるため、コード補完は出ません。設定したい任意のKey名にします。
```
"{% $states.input.text %}"
```

最終的にcontextの情報とinputの情報を出力で渡してみるようにしましょう。
```
{
  "context": "{% $states.context.StateMachine.Name %}",
  "text": "{% $states.input.text %}"
}
```

![スクリーンショット 2024-12-31 12.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/6fbab816-e639-2b0e-8269-959f188ac6e8.png)

:::note info
変数のコード補完もできるようになっています。
試しに変数タブを開き、下記の`myNumber`という変数を設定してみます。

```json
{
  "myNumber": 0

}
```
![スクリーンショット 2024-12-31 13.45.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/dd89a699-feea-4eae-4dcb-875214975e7c.png)

次に既存のPassステートの次にもう一つPassステートを追加し、出力エディタで変数を参照してみます。
![スクリーンショット 2024-12-31 13.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/707452ae-dfc7-bdec-10a3-5dc4b109f0ee.png)

`"{% $m %}"`まで書き進めると、下記のようにコード補完が効いてサジェストされています！
![スクリーンショット 2024-12-31 13.47.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/989ad23d-422d-4194-f4fc-a0cf1c40340b.png)

:::

ここまでが補完機能の説明になります。

### ② JSONata専用エディタ
JSONata専用のエディターも使用することができます。このエディターはフォームエリア全体の編集エディターではなく、選択したJSONata式1つに対しての専用エディターになっています。

![スクリーンショット 2024-12-31 13.49.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/a31914b1-30fb-1619-294b-9f8f94421a6c.png)

専用エディタを開くにはJSONata式の右側に表示されている「✏️」マークをクリックします。

![スクリーンショット 2024-12-31 13.01.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/90079e29-b10c-7449-d649-95bd41981499.png)

`変更を保存して閉じる`を押すと、専用エディタでの変更内容が反映されます。

### ③ テスト実行

出力式が完成したので、意図通り動くか確認してみたいです。
一昔前まではワークフローを保存し、ステートマシンを実際に起動してみないと動作確認ができなかったのですが、
2023年11月のTestAPIの新規追加により、ワークフローの作成・編集の更新前に、ステートごとに単体の動作確認ができるようになっています。


https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-step-functions-https-endpoints-teststate-api/

テストを行うには`テスト状態`というボタンを押下します。

![スクリーンショット 2024-12-31 13.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/2f745909-b2f9-99c8-09f3-57d69d47579c.png)

モーダルが立ち上がります。

![スクリーンショット 2024-12-31 13.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/05aab7b2-fbd7-d08c-ffb9-9a6fd7015f90.png)

状態の入力欄に、下記のJSONを入力して、`テストを開始`を実行してみます。

```json
{
  "text" : "テストです"
}
```

すると、`Pass 成功しました`の表示とともに、右側には状態の出力欄に出力内容が表示されました。

![スクリーンショット 2024-12-31 13.56.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/5418d4c6-0ff8-ba18-62d1-57a1714b1bed.png)

入力内容を変えてテストすることで、状態の出力内容がどう変わるかをテストすることができます。
また、テストを行った際、エラーの発生や内容の変更で、出力内容のJSONを変更したくなった場合、
エディタ上で修正し、右下の`変更を適用して閉じる`を押下すると変更点を実際のステートマシンの内容に反映することができます。

試しに出力内容を変更してみましょう

下記のようにtext部分を書き換えてみます。
`"text": "{% $states.input.text & '！！！' %}"`

```json

{
  "context": "{% $states.context.State.EnteredTime %}",
  "text": "{% $states.input.text & '！！！' %}"
}
```

テスト実行すると、修正が反映されて、出力内容が変化しています。

![スクリーンショット 2024-12-31 13.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/868956a3-dff7-d057-5458-9eb52cf2faba.png)

これで編集を更新したい場合、右下の`変更を適用して閉じる`ボタンを押下することにより、テストで試した出力定義をそのままステートマシンの設定に反映することができます。

ボタンを押下してステートマシンのページに戻ると、

![スクリーンショット 2024-12-31 14.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415169/656ee452-ddfc-6c4f-13ac-d69150669e4d.png)

反映できていることが確認できました。

## おわりに
今回はStep Functions作成時に役立つコード補完やテスト実行についてまとめました。

慣れないJSONataの記法を使う場合にコード補完が効いてくれるととても助かりますし、候補を見ていると「あんなこともできそう？」とアイデアが膨らむきっかけにもなりますね。

ちょっとお試ししたいや、ワークフローの中で部分的にデバックを試したい場合にはテスト実行がとても便利です。ワークフローを作成・保存する手間や、別ステートの実行・結果を待つ手間が短縮できます。

ステートの数が増え、複雑かつ大きなワークフローになると単一ステートにフォーカスしたデバックを行うのが大変だったので、ありがたいですね。

Step Functions初学者にはまずこれらの便利機能を知っておくとその後のStep Functions Lifeが楽になりそうです。

それでは！