[AWS]Step Functionのチュートリアル終わったからとりあえずAPI Gatewayから呼んでみた

## 今回行う構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/9d5b1153-c8af-9fce-aee4-e4a61a6eb182.png)


1. ローカルからAPIエンドポイントを叩く
1. APIエンドポイントからLambdaを叩く
1. Lambdaからstep functionを叩く
1. Step Functionで設定したLambdaが叩かれる

## 想定読者

- [AWS公式のStep Functionを終わらせた](https://aws.amazon.com/jp/getting-started/hands-on/create-a-serverless-workflow-step-functions-lambda/)
- チュートリアルだけじゃもの足りない

## 今回説明しないこと

- Step Functionの説明
- Lambdaの説明
- API Gatewayの説明

**それぞれ素晴らしい記事があるので書きを参考にしてみてください**
[Step Function](https://dev.classmethod.jp/articles/aws-step-functions-for-beginner/)
[Lambda](https://dev.classmethod.jp/articles/cm-advent-calendar-2015-aws-re-entering-aws-lambda/)
[API Gateway](https://www.wafcharm.com/blog/api-gateway-for-beginners/)

## 手順

- Lambda作成
- API Gateway作成
- PostmanからAPIコールしてみる

前提として[AWS公式のStep Functionのチュートリアル](https://aws.amazon.com/jp/getting-started/hands-on/create-a-serverless-workflow-step-functions-lambda/)が終わっている方向けなのでStep Functionはできているという想定で行います

## 注意
AWS公式のチュートリアルのLambdaソースコードを下記のように書き換えます

```python
def lambda_handler(event, context):
    statuscode = event["statuscode"]
    print(statuscode)
    if statuscode == "429" or statuscode == 429:
        raise TooManyRequestsException('429 Too Many Requests')
    elif statuscode == "503" or statuscode == 503:
        raise ServerUnavailableException('503 Server Unavailable')
    elif statuscode == "200" or statuscode == 200:
        return '200 OK'
    else:
        raise UnknownException('Unknown error')
```

LambdaからのstatuscodeがStringで渡してもintで渡ってきているみたいなので
※こちらんの事象わかる方教えていただきたいです


### Lambda作成

まずは適当な名前でLambdaを作成してランタイムはpython3.6を使います

ソースコード

```python
import boto3

client = boto3.client('stepfunctions')

def lambda_handler(event, context):
  status_code =str(event["statuscode"])
  res = client.start_execution(
          **{
            'input': '{"statuscode": %s}'%status_code,
            'stateMachineArn':"{step functionのarn}"
            }
          )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/116319ae-b3bf-265d-37f4-5e1dc7494f7d.png)


そしたら下記のようなjsonでテストを行います

```json
{
  "statuscode": "200"
}
```

Step Functionを見ると成功になっているのが見れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/aa5b5ce1-3740-2f9b-047e-d2b9071894db.png)

### API Gateway作成

API Gatewayにアクセスして

**左下**のREST APIで「構築」をします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/58b8f03c-5658-7835-3832-8b078d068b9e.png)

API名は任意の名前で作成します

そしたらリソース名に任意の名前を入力して CORSを有効にして作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/02725eba-d5fa-8198-b196-bd48677defb0.png)

POSTメソッドを追加して先ほど作成したLambda関数を選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/30492f88-864c-a524-93de-2fc9fdaaf2e6.png)

デプロイします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/6935526b-243d-8fe3-c2be-554ce1833b06.png)


POSTメソッドを選択するとURLが発行されているのでそちらをコピーします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/acb106f3-24b0-5880-9686-57ee0fea54b6.png)

### PostmanからAPIコールしてみる

先程コピーしたURLをpostmanに貼り付けてPOSTでリクエストを送ってみます

**Request Bodyの入力を忘れないでください**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/07158745-90e3-f032-524e-2b78a097a242.png)

Step Function側からのレスポンスをLambda経由で受け取れていないのでnullが帰ってきますが、step functionでは処理が走っていると思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501320/2b010cc1-7491-ce02-4610-391d38e67b62.png)

##終わりに
Step Functionのチュートリアル後なにかやりたいと思いAPI Gatewayの連携をしましたが、
Step Functionの使い所は複数のLamｂdaの処理などが適しているのかな〜という所感です。