AWS Step Functionsを理解する第一歩

株式会社セゾンテクノロジー　Advent Calendar２日目！
私で下がったハードルは明日の山口さんが取り戻してくれるので是非記事閲覧をお願いします。

### 1.この記事の目的
AWS StepFunctionsなんもわからんオジサンが完全に理解した状態になること。
AWS-DVAの資格学習で文字だけでは理解しにくかったので実際に作って理解を深める。

![ダニング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/65573c71-895f-9e61-cda2-11538f69896a.png)

### 2.私の認識（勉強前）
サービスのページ開いたらステートマシンとアクティビティがあるけどそれぞれ何？
自動化できるらしいけど具体的にどんな自動化が出来るのか。

### 3.調べてみる
ステートマシンとは
>Step Functions はステートマシンとタスク に基づいています。Step Functions では、ステートマシンはワークフロー と呼ばれ、一連のイベント駆動型ステップです。ワークフローの各ステップは、状態 と呼ばれます。例えば、タスク状態は別の作業単位を表します。 AWS 別の を呼び出すなど、 サービスが実行する AWS のサービス または API。タスクを実行するワークフローを実行するインスタンスは、Step Functions で実行と呼ばれます。

[参考:Step Functions のステートマシンについて説明します。](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-statemachines.html)

アクティビティとは
> AWS Step Functionsアクティビティは、どこか (アクティビティワーカー と呼ばれる) で実行されているコードをステートマシン内の特定のタスクに関連付ける方法です。

[参考:Step Functions のアクティビティについて説明します](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-activities.html)


### 4. 結論

ようはワークフローの全体的な設計がステートマシン。
そのステートマシンの中で特定のタスクを実行するための物がアクティビティってことね。

**完全に理解した**（１回目）


### 5.ステートマシンを作って動かしてみよう
新規作成画面を開くと大量のテンプレートがある。
（2024/11月現在）

![Stepfunctions01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/eda22304-5306-7ae0-6fc6-9b08add5ddbd.png)

つまりこれらのテンプレートがあるパターンは全て自動化できるということで…
**え！？思ってたよりもかなり便利！**

StepFunctions完全に理解した（2回目）


空白テンプレートを選んで自分の理解のためにシンプルなフローを作ってみることにした。
Lamdbaで処理した結果によってFail/Successを出すシンプルな処理。
![step02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/420a92ff-4967-5162-0db9-9dc62b2de749.png)

コード側で行った設定は下記。
~~~
{
  "QueryLanguage": "JSONata",
  "Comment": "An example of the Amazon States Language for using batch job with pre-processing lambda",
  "StartAt": "Lambda Invoke",
  "TimeoutSeconds": 3600,
  "States": {
    "Lambda Invoke": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Output": "{% $states.result.Payload %}",
      "Arguments": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:kitano-test-lambda01",
        "Payload": "{% $states.input %}"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 1,
          "MaxAttempts": 3,
          "BackoffRate": 2,
          "JitterStrategy": "FULL"
        }
      ],
      "Next": "Choice"
    },
    "Choice": {
      "Type": "Choice",
      "Choices": [
        {
          "Condition": "{% $statusCode = 200 %}",
          "Next": "Fail"
        }
      ],
      "Default": "Success"
    },
    "Fail": {
      "Type": "Fail"
    },
    "Success": {
      "Type": "Succeed"
    }
  }
}
~~~

呼び出すLambdaはデフォルトで作成したもの。
![step03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/760286a2-b68a-a7a9-69ce-3b5431f64bf2.png)


作成して保存できたのでいざ実行。
![step04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/555d84c3-1c7b-368b-56e8-155acc713c2c.png)

Choiceの条件式は当然満たせない（$statusCode変数を定義していない）ため、Default指定のSuccessの方にフローが流れることを確認できた。
![step05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/0bccd21c-672a-a52b-f87b-57dab1136a4e.png)


### 6. まとめ

触ったり調べたりしてStep Functionsについて以下のように理解した。

**AWSで色々できるワークフローを構築し、色々自動化することができるサービス**
・色々なサービスを組み合わせられるため、イベントを検知した後他のサービスも連動して動作させられる。
・例えばLambdaやコンテナ内部でのジョブ実行の結果に合わせ、他のAWSリソースと連動させたりなどもできる。

複数のAWSサービスが連動するシステムを構築するときに非常に便利そうだなと感じた。

ここまで読んだら馬鹿の山への登山はできたと思うので、絶望の谷に落ちる記事はまた別の機会に。

---
#### 備忘録
Choiceを調べてコードを書いている際、下記の様にStringEqualsやNumericEqualsを指定するとコード上はエラーにならないが、ビジュアルエディター上では`Rule #1 : Must be a boolean or a valid JSONata expression.`と一生エラーになり続けた。
~~~
 "Choices": [
        {
          "Variable": "$.statusCode",
          "StringEquals": "200",
          "Next": "Fail"
        }
  ]
~~~

原因は単純にJSONata式とJSONPath式で変わっていたため。
~~どこでその式選択できるんだ…ビジュアルエディタから作ったら強制的にJSONataから変更でなかったんだけど…~~

解決参考記事
・[Simplifying developer experience with variables and JSONata in AWS Step Functions](https://aws.amazon.com/jp/blogs/compute/simplifying-developer-experience-with-variables-and-jsonata-in-aws-step-functions/)
・[Choice workflow state](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html)

---