Step Functions Workflow Studio for the VS Code IDEを試してみた

# 背景・目的
先日、VSCode でStep Functions Workflow Studioが利用できると発表がありました。
実際に試してみます。
なお、VSCodeの発表ですが、私はCursorを使用しているので、**Cursorで試してみます。**

https://aws.amazon.com/about-aws/whats-new/2025/03/aws-step-functions-workflow-studio-vs-code-ide/?nc1=h_ls

# まとめ
- VSCode（Cursor）でStep Functions Workflow Studioが利用できるようになった
- TestState APIを使用してテストが可能


# 概要
関連した内容を整理します。

## TestState API
下記を基に整理します。

https://docs.aws.amazon.com/step-functions/latest/dg/test-state-isolation.html

> TestState API は 1 つのステートの定義を受け入れ、それを実行します。ステートマシンを作成したり、既存のステートマシンを更新したりしなくても、ステートをテストできます。

- 1つのStateの定義を受け入れて実行する
- ステートマシンを作成したり、既存のステートマシンを更新しなくても良い

> TestState API を使用する場合は、次の考慮事項に留意してください。
> - TestState API には以下のサポートは含まれていません。
>    - 以下のリソースタイプを使用する Task ワークフロー状態 ステート:
>        - アクティビティ
>        - .sync または .waitForTaskToken のサービス統合パターン
>    - Parallel ワークフローの状態 ステート
>    - Map 状態のワークフロー ステート
> - テストは最大 5 分間実行できます。テストがこの期間を超えると、States.Timeout エラーで失敗します。

- テストは最大 5 分間実行可能。超えるとタイムアウトエラーになる

## Amazon States Language
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-amazon-states-language.html

> Amazon ステートメント言語は JSON ベースの構造化言語で、ステートマシンおよび作業を実行できる状態のコレクション (Task 状態) の定義、次に移行する状態の決定 (Choice 状態)、エラーによる実行の停止 (Fail 状態) などに使用されます。

- ASLは、Amazon States Languageの略
- JSONベースの構造化言語
- 下記ができる
    - ステートマシン、作業を実行できる状態のコレクションの定義
    - 次に移行する状態の決定（Choice）
    - エラーによる実行の停止など


### State Machine 構造
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/statemachine-structure.html

|項目|必須/オプション|説明|
|:--|:--|:--|
|QueryLanguage|オプション|ステートマシンで使用されるクエリ言語の名前。<BR>指定できる値は JSONPath と JSONata<BR>デフォルト値は JSONPath|
|Comment|オプション|説明|
|StartAt|必須|いずれかの状態オブジェクトの名前と完全に一致する必要がある|
|TimeoutSeconds|オプション|ステートマシンを実行できる最大秒数。指定された時間より長く実行されると、States.Timeoutで実行が失敗する|
|Version |オプション|ステートマシンで使用される のバージョン<BR>デフォルトは1.0|
|States|必須|オブジェクトには、コンマで区切られた一連の状態|



# 実践
:::note info
VSCodeではなく、Cusrsorを使用しています
:::


下記を参考に試してみます。

https://aws.amazon.com/jp/blogs/compute/introducing-an-enhanced-local-ide-experience-for-aws-step-functions/



## 前提
- OS:MacOS
- エディタ:Cursor
- 言語：Python

下記の構成とします

## 環境準備
### GitHubリポジトリの作成
1. リポジトリを作成します
    ```bash
    % gh repo create sample-step-functions --public --clone
    ✓ Created repository XXXXXX/sample-step-functions on GitHub
      https://github.com/XXXXXX/sample-step-functions
    % 
    ```

1. できました
    ```bash
    % gh repo view XXXX/sample-step-functions 
    XXXX/sample-step-functions
    No description provided
    
    This repository does not have a README
    
    View this repository on GitHub: https://github.com/XXXX/sample-step-functions
    % 
    ```

### AWS Tookit のインストールと接続
1. Cursorを開きます
1. 拡張機能タブを開きます
1. 「AWS Toolkit for Visual Studio Code」を入力し、インストールボタンをクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/57cb7779-b254-49a7-8b83-f1d335bf32bb.png)

1. インストールされました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7595ee81-514f-4621-b048-65633d120a94.png)


1. 次に接続します。まずは事前にSSOでサインインします（私はSSOを使用していますが、credentialsをローカルに保存されているようでしたら、不要です）
    ```bash
    aws sso login --sso-session XXXXXXX
    ```
1. Explorerで「Select a connection...」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2c663c24-96c4-401d-af8f-094d42d604f5.png)

1. Switch Connectionに自身のAWS profileを指定します
1. AWSのオブジェクトが見えました！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/abee1a59-9443-4df9-b611-ac2aa68542ea.png)


### ワークスペースを追加
1. Cusrorのワークスペースの追加をクリックし、上記で作成したリポジトリを指定します


## コード

### Amazon States Language
1. 「statemachines」ディレクトリを作成します
1. 「hello-world.asl.json」ファイルを作成します。この時点で表示されました！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6edb639d-9d64-4804-96fb-b0a4107b3f2f.png)

1. 折角なのでGUIで実装してみます。検索ウィンドウにpass入力し、ドラック＆ドロップしてみます

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f17023e8-5b9d-4bb9-942a-03202f7001f3.png)

1. ①「設定」タブをクリックし下記を指定します
    - ②：状態名を「Pass」
    - ③：次の状態を「最後に移動」
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1d3533e7-f8ef-4655-8bb6-fa9db2dbd5e5.png)

1. ①「出力」タブをクリックし、②「出力」に文字列を指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bf9e390e-11af-4b37-b2c7-01545b4ec1c2.png)

1. コードを見ると下記のように作られていました
    ```json
    {
      "Comment": "A description of my state machine",
      "StartAt": "Pass",
      "States": {
        "Pass": {
          "Type": "Pass",
          "End": true,
          "Output": {
            "result": "Hello"
          }
        }
      },
      "QueryLanguage": "JSONata"
    }
    ```
1. 「テスト状態」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cc4aa49e-05da-4026-a7e8-098516a4cd07.png)
1. 「テストを開始」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/22a8dfc6-8544-4e7f-aa64-d38862f303b7.png)

1. テストが成功しました（当然ですが）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3ce478d9-760e-48a0-a5f7-92365d8c803e.png)


# 考察
今回は、Step Functions ASLを使って、ローカルでステートマシンの作成と単体ステートのテスト実行を試しました。
Cursor（VSCode）とAWS Toolkitを併用することで、開発がスムーズに進みそうと感じました。
一方で、ステートマシンから実際のLambda関数を呼び出すためには、事前にAWS上にデプロイしておく必要があるなど、ASLのテストが「完全にローカルで完結するわけではない」点がわかりました。

今後は、下記を試してみたいと思います。
- Lambda以外のサービス（SQSやBatchなど）との連携
- CloudFormationを使ったASLの本番環境へのデプロイまでの一連の開発


# まとめ
https://aws.amazon.com/about-aws/whats-new/2025/03/aws-step-functions-workflow-studio-vs-code-ide/?nc1=h_ls

https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/stepfunctions-workflowstudio.html

https://aws.amazon.com/jp/blogs/compute/introducing-an-enhanced-local-ide-experience-for-aws-step-functions/

https://aws.amazon.com/blogs/compute/accelerating-workflow-development-with-the-teststate-api-in-aws-step-functions/

https://docs.aws.amazon.com/step-functions/latest/dg/test-state-isolation.html

https://states-language.net/spec.html

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-amazon-states-language.html

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

https://docs.jsonata.org/overview.html