【AWS Lambda関数作成】Step Functionsの設定方法

## はじめに
【AWS Lambda関数作成】Step Functionsの設定方法に関しての備忘録です。
初心者です😅
間違えてる部分が多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇
<br>
## 🦁<INS>**結論**</INS>🦁
## StepFunctionsを使う目的
「APIGatewayへのリクエストが30秒でタイムアウト」してしまうことを回避するためです。
Step Functionsはあらゆるデータのやりとりを一つのフローとして保存することができるサービスです。

## 手順
1. StepFunctionsを開いて作成を開始する。
2. 「自分で作成する」を選択。
3. 「AWS Lambda Invoke」をドラックアンドドロップする
4. コードを修正する。
5. 作成する

※詳細は下記に掲載してます。

:::note info
押さえておくべき点
* Step functionsは様々なデータのやり取りを一つのフローとして保存できるサービス。
*  Lambda Invokeは Lambda関数をスタートさせレスポンスその処理を非同期処理させることができるので他の処理を進めることができる。
:::  
***

:::note warn
利用シーン
* AWSでのAPI Getewayを使う時（30秒以内に終わる処理を除く）
:::  
***


:::note alert
注意点
* データを渡される時の定義は「Step functions」独特の書き方をする。（$を使って記述する）
:::  

***


## <INS>**前提**</INS>🙊
AWSのアカウント作成が終わってる。
AWS Lambdaの環境構築が終わってる。
AWS Lambdaのコードがテスト含め完了してる。
ロールの作成が完了してる。


***


## 手順詳細
1. StepFunctionsを開いて作成を開始する。
2. 「自分で作成する」を選択。
3. 「AWS Lambda Invoke」をドラックアンドドロップする
4. コードを修正する。
5. 作成する

これらの詳細を、下記にて示していきます。

## StepFunctionsを開いて作成を開始する。
1. AWSの最初の画面で左上の検索バーにて「StepFunctions」と入力して検索。
2. 「StepFunctions」を選択。

***
## 「自分で作成する」を選択。
1. 初期の画面で３つの中から選択肢の中から「自分で作成する」を選択する。
***



## 「AWS Lambda Invoke」をドラックアンドドロップする
1. 「Lambda Invoke」を「最初の状態をここにドラッグ」と書かれてる箇所にドラッグ&ドロップする。<br>
![スクリーンショット 2023-12-16 4.24.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/7749c4d5-b9ce-8d62-7dd0-ee7a499935e4.png)





***

## ステートマシン名とロールとログの設定。
画面中央にある「設定」をクリックしてステートマシン名を編集する（今回は「MyStateMachine-test」とする）<br><br>

![スクリーンショット 2023-12-17 8.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/75405dec-48d7-8c7b-35ad-4cdba16eac83.png)

アクセス許可の部分で実行ロールを作成したものを選択する<br>
![スクリーンショット 2023-12-17 8.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/a35866d0-d657-ffe7-aebe-b14165c2977e.png)
<br><br>

ログ記録でログレベルを「ALL」を選択して、そのほかはデフォルトのままでOK。<br>
![スクリーンショット 2023-12-17 8.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/17fa7333-e91c-8107-e14c-9712695df87a.png)

「作成する」をクリック。<br>

![スクリーンショット 2023-12-17 8.33.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/a76ed7f0-a241-bd80-8033-76c09c3c005c.png)

***

## コードを修正する。
デザインの横にある「{} Code」の部分をクリックして下記のコードを修正して貼り付ける。<br>
![スクリーンショット 2023-12-16 6.41.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522630/a7beb5cd-b1ee-37a3-1ef0-ccc239d2d11b.png)

```
{
  "Comment": "ステートマシンのテスト",
  "StartAt": "Lambda Invoke",
  "States": {
    "Lambda Invoke": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "Payload": {
          "local_jan_code.$": "$.local_jan_code"
        },
        "FunctionName": “<Lambda関数のARNをここに貼り付ける>”
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "End": true
    }
  }
}

```
上記を入力する。

***
## 作成する
確認のうえ、右上の「作成する」をクリック。
完了。
***

## コード部分の解析①　Lambda Invokeの定義
```
  "Comment": "ステートマシンのテスト",
  "StartAt": "Lambda Invoke",
  "States": {
    "Lambda Invoke": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
```
"Lambda Invoke”は基本、上記になるの設定になる
***

## 各行のまとめ
### Type": "Task"
Step Functionsのワークフロー内で特定の作業（タスク）を表していることを意味してる。
「Lambda Invoke」は「Task」になる。

### "Resource": "arn:aws:states:::lambda:invoke"
Step Functionsで特定のAWSサービス（この場合はLambda）のアクションを実行するための識別子。Lambda関数を呼び出すアクションそのもの。

### "OutputPath": "$.Payload"
 Lambda関数によって出力されてるものを特定の場所（Payload）に保管して、それ自体を次のステップに出力してる

***

### **<INS>※ここから先はStepFunctionsの設定などが完了してから実施。**

## コード部分の解析②　 Lambda関数に渡すデータの定義
```
      "Parameters": {
        "Payload": {
          "local_jan_code.$": "$.local_jan_code"
        },
        "FunctionName": “<Lambda関数のARNをここに貼り付ける>”
      },
```
## 各行のまとめ
###   "Payload":  
ここで定義したものが関数に渡されるものデータを定義してる。
"$.local_jan_code"→ローカルからきたデータ

"local_jan_code.$"→ key → $が後に入力（追記してる）
"$.local_jan_code"→ value → $は前に入力（リクエストデータ値）

例えば既存のjsonで
keyと valueがあった場合は
"$.local_jan_code":"$.local_jan_code"になる

今回のデータは valueのみだったので
"local_jan_code.$" : "$.local_jan_code"
になっている。

### "FunctionName": 
ここにはLambda関数のARNをここに貼り付けて実際にやり取りする関数のアドレスを示す。
***

## コード部分の解析③　例外処理の定義
```
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "End": true
```
Retryは例外処理のこと。
この例外処理があった時の処理内容が記載されてる。

## 各行のまとめ
###  "ErrorEquals": []
[]内のエラーを、通知してくれる。

### Lambda.ServiceException
Lambdaのコンピューターに何か問題がある時。例えば、Lambdaのシステムが壊れているとき。

### Lambda.AWSLambdaException
Lambdaが内部でエラーを起こした時。例えば、プログラムのコードが間違っているとき。

### Lambda.SdkClientException
Lambdaを使おうとした人のコンピューターに問題がある時。例えば、インターネットが繋がっていないとき。

### Lambda.TooManyRequestsException
たくさんの人が同時にLambdaを使おうとして、混雑している時。

***

## 参考にしたサイト📗
[APIGatewayタイムアウト不可避を回避（神回避）](https://qiita.com/haruki-lo-shelon/items/9e5781668b0c92e955be)

***

AWS Lambda関数作成 セクション　リンク
1. [<INS>AWSアカウントの作成](https://qiita.com/nyanyacyan/items/f533938e4f5d7960a32e)
2. [<INS>AWSの開発環境の構築](https://qiita.com/nyanyacyan/items/d1dd2fb874725226f9da)
3. [<INS>Lambda関数の開発とデバッグ](https://qiita.com/nyanyacyan/items/9644db9eb01bdc91d85b)
5. [<INS>IAMロールの作成と設定（途中まで作成したら、Step Functionsを設定する必要あり）](https://qiita.com/nyanyacyan/items/8b0bba4fe59b0c06a946)
6. [<INS>AWS Step Functionsの設定とデバッグ（完了後、IAMの権限にStep Functionsを追加）](https://qiita.com/nyanyacyan/items/004e0dc6145a0fc90b1d)
7. [<INS>API Gateway（発火API）の設定とデバッグ](https://qiita.com/nyanyacyan/items/3cd13fc016103d1de5c1)
8. [<INS>API Gateway（状態維持API）の設定とデバッグ](https://qiita.com/nyanyacyan/items/e96686b5b54b4059d2aa)
9. [<INS>Python（local環境）の開発とデバック](https://qiita.com/nyanyacyan/items/d76e98b0e6e9d9665a54)