Step FunctionsとAPI Gatewayの統合【後編】

#はじめに
[前回の記事](https://qiita.com/JJ33/items/7b42845f0ee4c321eb0c)の続きで、APIGatewayを使いステップ関数を使用して、マイクロサービスをオーケストレーションし、AWSサービスにアクセスする方法について書いていきます。

#マイクロサービスの自動化
まず前提として、Step Functionsに組み込まれている障害処理、意思決定の分岐、および並列処理を使用して、アプリケーションのバックエンドを調整しているとします。
開発者は、APIGatewayを使用してバックエンドマイクロサービスへのアクセスを管理しています。
##APIGatewayを使う
要求、応答形式を標準化し、ビジネスロジックをルーティングロジックから切り離すのに役立ちます。
開発者が認証、スロットル、負荷分散などの責任を軽減できるようにすることで、複雑さを軽減します。
##新しいAPIGateway統合を活用する
開発者はAPIGatewayエンドポイントを使用して、堅牢なワークフローを構築してマイクロサービスを調整できます。
これらのマイクロサービスは、サーバーレスまたはコンテナベースにすることができます。

次の例は、APIGatewayとStep Functionsを使用し、マイクロサービスをオーケストレーションして、AWSサービスにアクセスする方法を説明しています。

このアプリケーションの[サンプルコード](https://github.com/aws-samples/example-step-functions-integration-api-gateway)

![2020-12-07_10h31_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/2e2f8803-8266-9673-b6f6-e88bbc5f5b84.png)

##アプリケーションを実行する

GitHubリポジトリのクローンを作成します。

```Bash:Bash
$ git clone https://github.com/aws-samples/example-step-functions-integration-api-gateway.git
$ cd example-step-functions-integration-api-gateway
```

AWS SAM CLIを使用して、アプリケーションをデプロイし、すべてのデフォルトのパラメーター入力を受け入れます。

```Bash:Bash
$ sam build && sam deploy -g
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/8e63d8bb-36f5-61b8-4a6f-ed1a3eb96da1.png)

これにより以下の１７のリソースがデプロイされます。

- Step Functions標準のワークフロー
- 3つのリソースエンドポイントを備えたAPI Gateway REST API
- 3つのLambda関数
- DynamoDBテーブルを含む17のリソース

[StockTradingStateMachineArn]値をメモします。
これは、コマンドライン出力またはAWSLambdaコンソールの[アプリケーション/セクション]にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/80783b91-cd12-56c0-0ab4-70c21086a0d0.png)

##ワークフローを手動でトリガーする
ターミナルウィンドウから、ワークフローを手動でトリガーします。

```Bash:Bash
aws stepFunctions start-execution \
--state-machine-arn <StockTradingStateMachineArnValue>
```
応答は以下のようなものが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/a7eedf98-47a9-9e95-8266-10b738c33549.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/7522a55b-479f-aded-a007-2c8a787d15fe.png)

ワークフローが実行されると、APIGatewayから[/check]リソースへのGETリクエストを介して、Lambda関数が呼び出されます。

これにより、1〜100のランダムな株価値が返されます。
この値は、50未満かそれ以上かによって、購入または販売の選択で評価されます。

##Lambda関数を呼び出す
販売状態と購入状態は、APIGateway統合を使用してLambda関数を呼び出します。
POSTメソッドを使用します。
"stock_value"は、 POSTリクエストです。
"transaction_result"で返され、"ResponseBody"に渡します。
最終状態は、遷移のログをDynamoDBテーブルに書き込みます。

##AWSSAMテンプレートを使用したリソースの定義

ステップ関数リソースは、このAWSSAMテンプレートで定義されています。
"DefinitionSubstitutions"のフィールドは、ワークフロー定義にテンプレートパラメータを渡すために使用されます。

```YAML:YAML
StockTradingStateMachine:
    Type: AWS::Serverless::StateMachine # More info about State Machine Resource: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html
    Properties:
      DefinitionUri: statemachine/stock_trader.asl.json
      DefinitionSubstitutions:
        StockCheckPath: !Ref CheckPath
        StockSellPath: !Ref SellPath
        StockBuyPath: !Ref BuyPath
        APIEndPoint: !Sub "${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com"
        DDBPutItem: !Sub arn:${AWS::Partition}:states:::dynamodb:putItem
        DDBTable: !Ref TransactionTable
```
ワークフローは別のファイル（/statemachine/stock_trader.asl.json）で定義されています。

次のコードブロックは、株価のチェック状態を定義します。
新しいリソースは、[arn:aws:states:::apigateway:invoke]APIGatewayのサービス統合タイプを意味します。

パラメータオブジェクトは、サービス統合を構成するために必要なフィールドを保持します。
パスと"ApiEndpoint"値によって、提供される"DefinitionsSubstitutions"のAWS SAMテンプレート内のフィールドです。
"RequestBody"の入力はアマゾン米国の言語を使って動的に定義されます。
[.$]フィールド名の末尾に"RequestBody"を指定するパラメータは、入力にJSONノードを参照するためのパスを使用します。

```YAML:YAML
"Check Stock Value": {
  "Type": "Task",
  "Resource": "arn:aws:states:::apigateway:invoke",
  "Parameters": {
      "ApiEndpoint":"${APIEndPoint}",
      "Method":"GET",
      "Stage":"Prod",
      "Path":"${StockCheckPath}",
      "RequestBody.$":"$",
      "AuthType":"NO_AUTH"
  },
  "Retry": [
      {
          "ErrorEquals": [
              "States.TaskFailed"
          ],
          "IntervalSeconds": 15,
          "MaxAttempts": 5,
          "BackoffRate": 1.5
      }
  ],
  "Next": "Buy or Sell?"
},
```
展開プロセスは、ApiEndpoint値を検証します。
サービス統合は、"https：// [APIendpoint] / [Stage] / [Path ]"の形式で、parametersブロックで提供される情報から、APIエンドポイントのURLを構築します。

#所感
APIゲートウェイでのステップ機能の統合の紹介と
REST API、HTTP APIの機能を、ワークフローステップから直接呼び出す機能をご紹介しました。

Step Functionsに組み込まれているエラー処理は、開発者がコードを削減し、ビジネスロジックを切り離すのに役立ちます。
これをAPIGatewayと組み合わせて、認証、スロットリング、負荷分散などの重荷を軽減できます。
インフラストラクチャを管理することなく、APIGatewayを介してコンテナまたはLambda関数にデプロイされたマイクロサービスを自動化できるので、試してみる価値大です！

#公式リンク
[Step FunctionsからAPI Gatewayを利用する](https://docs.aws.amazon.com/step-functions/latest/dg/connect-api-gateway.html)
[AWS公式サイト](https://aws.amazon.com/jp/)