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

#はじめに
AWS Step FunctionsがAmazon API GatewayとインテグレーションされからAPI Gatewayを直接呼び出すことが可能になりました。
外部APIを呼び出しその結果を待って次の処理に移るようなワークフローを構築するときに便利です。

#従来のAPI Gatewayの呼び出し
従来はLambdaを呼び出して、Lambda関数から外部サービスをコールし、結果を待つように実装する必要がありました。
さらに結果待ちの間も課金が発生していました。
今回のアップデートによって外部待ちの部分はStep Functionsで組めるようになるため、Lambdaを利用する必要がなくなります。
結果として、よりシンプルかつコスト効率の高いワークフローを設計可能になります。
最小限のコードと組み込みのエラー処理でバックエンドオーケストレーションが可能です。

##API Gatewayとはどんなもの？
あらゆる規模のAPIを簡単に作成、公開、維持、監視、保護できるようにするフルマネージドサービスです。
これらのAPIを使用すると、アプリケーションはバックエンドサービスからデータ、ビジネスロジック、または機能にアクセスできます。

##Step Functionsはどんなもの？
AWS Lambda、Amazon SNS、AmazonDynamoDBなどのAWSサービスを使用して復元力のあるサーバーレスオーケストレーションワークフローを構築できます。
AWS Step Functionsは、多くのサービスとネイティブに統合されています。
Amazon States Language（ASL）を使用すると、タスクの状態から直接これらのサービスを調整できます。

#追加のリソースタイプについて
APIGatewayとの新しいStepFunctions統合は、StandardワークフローとExpressワークフローの両方で使用できます。
APIゲートウェイを簡単に呼び出すことができます。

[統合パターンを使用する](https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html)

Request-Response：サービスを呼び出し、HTTP応答を受信した直後にStepFunctionsを次の状態に進めます。
このパターンは、標準ワークフローと高速ワークフローでサポートされています。
Wait-for-Callback：タスクトークンを使用してサービスを呼び出し、そのトークンがペイロードとともに返されるまでステップ関数を待機させます。
このパターンは、標準ワークフローでサポートされています。

#パラメータフィールド
以下のAmazon StatesLanguageパラメータフィールドで設定されます。

ApiEndpoint： APIルートエンドポイント。
パス：APIリソースパス。
メソッド：HTTPリクエストメソッド。
HTTPヘッダー：カスタムHTTPヘッダー。
RequestBody：APIリクエストの本文。
ステージ：APIゲートウェイのデプロイステージ。
AuthType：認証タイプ。

#チュートリアル
ステップ関数とのAPIGateway統合は、以下を使用して、もしくはAWSマネジメントコンソール内から構成できます。

* AWSサーバーレスアプリケーションモデル（AWS SAM）
* AWSコマンドラインインターフェイス（AWS CLI）
* AWS CloudFormation

#AWSマネジメントコンソール編

1.AWSマネジメントコンソールの[StepFunctions]ページに移動します。
2.[サンプルプロジェクトの実行]を選択し、[APIゲートウェイを呼び出す]を選択します。
定義セクションショー例のワークフローを構成するASL。
次の例は、新しいAPIGatewayリソースとそのパラメーターを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/25c4365b-482d-949f-6148-805136a8ecb1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/993ea8e0-3706-56ff-d749-bccf1f2e534c.png)
3.定義例を確認し、[次へ]を選択します。
4.「リソースのデプロイ」を選択します。

これにより、ステップ関数の標準ワークフローと/pets、GETメソッドとPOSTメソッドを含むリソースを含むRESTAPIがデプロイされます。
また、ステップ関数からAPIエンドポイントを呼び出すために必要な権限を持つIAMロールをデプロイします。

#RequestBodyのフィールド
APIの要求入力をカスタマイズすることができます。
これは、ワークフローペイロードから取得した静的入力または動的入力の場合があります。

#ワークフローの実行
1.AWSマネジメントコンソールの[StepFunctions]ページから新しく作成されたステートマシンを選択します
2.[実行の開始]を選択します。
3.次のJSONを入力フィールドに貼り付けます。

```JSON
{
  "NewPet": {
    "type": "turtle",
    "price": 74.99
  }
}
```
4.[実行の開始]を選択します
5.「ペットショップデータの取得」ステップを選択してから、「ステップ出力」タブを選択します。
これは、「ペットショップに追加」POSTリクエストからの正常なresponseBody出力と、「ペットショップデータの取得」 GETリクエストからの応答を示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/09e7d2d9-3b30-5878-288c-bb3cfc16465f.png)

#アクセス制御
API Gateway統合は、AWS Identity and Access Management（IAM）の認証と承認をサポートします。
これには、IAMの役割、ポリシー、およびタグが含まれます。

##AWS IAMのロールとポリシー
API全体または個々のメソッドに適用できる柔軟で堅牢なアクセスコントロールを提供します。
これは、RESTAPIまたはHTTPAPIを作成、管理、または呼び出すことができるユーザーを制御します。

##タグベースのアクセス制御
タグベースのアクセス制御を使用すると、すべてのAPIGatewayリソースに対してよりきめ細かいアクセス制御を設定できます。
タグのキーと値のペアを指定して、API Gatewayリソースを目的、所有者、またはその他の基準で分類します。
これは、RESTAPIとHTTPAPIの両方のアクセスを管理するために使用できます。

##API Gatewayリソースポリシー
指定されたプリンシパル（通常はIAMユーザーまたはロール）がAPIを呼び出すことができるかどうかを制御するJSONポリシードキュメントです。
リソースポリシーを使用して、AWS StepFunctionsを介してRESTAPIへのアクセスを許可できます。
これは、別のAWSアカウントのユーザー、または指定された送信元IPアドレス範囲またはCIDRブロックのみの場合があります。

#AuthTypeパラメーター
API Gateway統合のアクセス制御を構成するには、AuthTypeパラメーターを次のいずれかに設定します。

1. `{“AuthType””: “NO_AUTH”}`
許可なくAPIを直接呼び出します。これがデフォルト設定です。
2. `{“AuthType””: “IAM_ROLE”}`
ステップ関数は、ステートマシンの実行ロールを引き受け、署名バージョン4を使用して資格情報を使用して要求に署名します。
3. `{“AuthType””: “RESOURCE_POLICY”}`
ステップ関数は、サービスプリンシパルを使用してリクエストに署名し、APIエンドポイントを呼び出します。


#終わりに
ワンステップで構築が済んで、なおかつコストを下げれるようになるのは、どんな用途に対しても強いアプローチになりますね。
さらに後編に続きます。
APIGatewayを使用してステップ関数を使用してマイクロサービスをオーケストレーションしてAWSサービスにアクセスする方法について書いていきます。

#公式
[AWS Re:Invent](https://reinvent.awsevents.com/)
[awsブログ](https://aws.amazon.com/jp/blogs/news/aws-weekly-20201116/)