AWS StepFunctionsの良いところ/悪いところ

# この記事について

最近プロジェクトにて初めてAWS StepFunctionsを利用したので、良いところ/悪いところをこの記事にまとめます。

# StepFunctionsとは？

AWSが提供するワークフローを実装するためのマネージメントサービスです。
AWS APIとの連携機能が豊富であり、AWS APIの操作をローコード/ノーコードで実装することが可能です。。

# 良いところ

## 学習コストが(比較的)低い

ワークフローを構成するために覚える必要があることが少ないです。

- ワークフローを構成するコンポーネント(ステート)の利用方法
- 入力/出力の制御方法
- エラー処理方法

最低限上記をおさえておけば、StepFunctionsを利用することが可能です。
また直感的に理解できることが多いため、量と質の面において学習コストが低いと思います。

## GUIで直感的にワークフローを作成することができる

2021年にリリースされたStepFunctions Workflow Studioを利用することで、GUIで直感的にワークフローを作成することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/a0a54512-dc6e-2f5b-5d43-c3803aff8d8a.png)

https://aws.amazon.com/jp/blogs/news/new-aws-step-functions-workflow-studio-a-low-code-visual-tool-for-building-state-machines/

この機能により学習コストの低さを実現できていると言っても過言ではないかと思います。

この機能がリリースされる前はASL(Amazon State Language)というJSONに近い形式でワークフローを定義する必要がありました。
```plaintext:ASLのサンプル
{
  "Comment": "An example of the Amazon States Language using a choice state.",
  "StartAt": "FirstState",
  "States": {
    "FirstState": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FUNCTION_NAME",
      "Next": "ChoiceState"
    },
    "ChoiceState": {
      "Type" : "Choice",
      "Choices": [
        {
          "Variable": "$.foo",
          "NumericEquals": 1,
          "Next": "FirstMatchState"
        },
        {
          "Variable": "$.foo",
          "NumericEquals": 2,
          "Next": "SecondMatchState"
        }
      ],
      "Default": "DefaultState"
    },

    "FirstMatchState": {
      "Type" : "Task",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:OnFirstMatch",
      "Next": "NextState"
    },

    "SecondMatchState": {
      "Type" : "Task",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:OnSecondMatch",
      "Next": "NextState"
    },

    "DefaultState": {
      "Type": "Fail",
      "Error": "DefaultStateError",
      "Cause": "No Matches!"
    },

    "NextState": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:FUNCTION_NAME",
      "End": true
    }
  }
}
```
https://docs.aws.amazon.com/step-functions/latest/dg/concepts-amazon-states-language.html

StepFunctions Workflow Studioで作成したワークフローはASL形式にエクスポートすることが可能です。
そのため、GUIで作成したワークフローをコードとして管理することも可能です。


## 並列(非同期)処理の実装が簡単

Parallelステートを利用すれば、並列(非同期)処理を簡単に実装することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/3d5da9f4-7076-be0b-74ff-3363afc7163c.png)

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

もしpythonなどのプログラミング言語で行うとなると、threadingなどを利用する必要があり実装が大変です。
並列(非同期)処理の実装がラクなのもStepFunctionsの良いところだと思います。

## SAMでコード管理しやすい

SAMはStepFunctionsをサポートしています。
https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-sam-sfn.html

そのためSAMを使えば、StepFunctionsやワークフローで利用するLambdaやIAMロールなどをコードで統合管理することが可能です。

StepFunctions Workflow Studioで作成したワークフローはASL形式にエクスポートすることができるので、SAMのコードにGUIで作成したワークフローを組み込むことが可能です。

## AWS APIとの連携が簡単

StepFunctionsではノーコードでAWS APIを実行することが可能です。
そのためAWS APIを読み出すLambdaなどを作成する必要なく、AWS APIと連携が可能です。


# 悪いところ

## SAMで管理するには少し手間がかかる

> StepFunctions Workflow Studioで作成したワークフローはASL形式にエクスポートすることができるので、SAMのコードにGUIで作成したワークフローを組み込むことが可能です。

こうは言いましたが、エクスポートしたASLファイルをワークフローに組み込む前にやらなくてはいけないことがあります。

呼び出すLambdaの識別子などの手直しが必要です。。エクスポートした時点ではLambdaのARNが識別子となっていますが、SAMでコード管理するにあたりCloudformationにおける参照を識別子にする必要があります。ワークフロー内のLambdaが増えれば増えるほどこの手直しが大変になります。


## 標準機能のログの可読性が悪い

StepFunctionsには標準のログ出力機能があります。
有効にするとCloudwatch Logsにログを出力してくれます。

ただこのログは可読性が悪いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/5b012928-a412-5b28-cde1-cb5ca508f181.png)


設定できる項目もログレベル程度なので、標準機能のログだけだとなかなかきついものがあります。

LambdaやCloudwatch LogsのAPIなどを利用して、独自にログ出力機能を実装がした方が良いと個人的には考えています。