普通にLambdaで関数を作成し、API GatewayでWepアプリ化しても、以下の制限により使い物にならない場合がある。
- API Gatewayの最大タイムアウト30秒以内にレスポンスが無い場合(タイムアウトエラー)
- Lambdaの最大タイムアウト15分以内に処理が終わらない場合(タイムアウトエラー)
上記にのような問題を、複数のLambdaを並列で実行でき、非同期でレスポンスを返すStep Functionsを使えば解決できる。
1. IAMロールの作成
- IAM コンソールでロール -> ロールの作成の順に選択する。
- AWSサービスを選択し、他の AWS のサービスのユースケース:で、API Gatewayを選択し。次へを押す。
- 次へを押す。
- 任意のロール名(例:APIGatewayToStepFunctions)を入力する。
- ロールを作成を選択する。
- ロールのリストで、作成したロールの名前を選択し、[Role ARN] (ロール ARN) をメモします。
arn:aws:iam::123456789012:role/APIGatewayToStepFunctions - 許可を追加 -> ポリシーをアタッチを押す。
- AWSStepFunctionsFullAccessを検索し、チェックを入れて、許可を追加を押す。
2. Lambda関数の作成
- Lambda コンソールで関数の作成を押す。
- 一から作成を選択し、任意の関数の名前を入力し、ランタイムにPython 3.9を選択し、関数の作成を押す。
- 関数の Amazon Resource Name(ARN) をコピーする。
arn:aws:lambda:us-east-1:123456789012:function:HelloFunction
3. Step Functionsのステートマシンの作成
- Step Functions コンソールでステートマシンの作成を押す。
- ワークフローを視覚的にデザインするで、次へを押す。
- 左側のアクションから、AWS Lambda Invokeを「最初の状態をここにドラッグ」へドラッグアンドドロップする。
- 右側のInspector パネルのAPI パラメータで、Lambda 関数をリストから選択する。
- 次へを押す。
- 次へを押す。
- 任意のステートマシンの名前を入力し、アクセス許可で新しいロールの作成を選択する。
- ステートマシンの作成を押す。
- 実行の開始を押し、実行の開始を押す。
- CloudWatch等で正常にLambdaが実行されたか確認する。
4. API GatewayのREST APIの作成
- Amazon API Gateway コンソールでAPI を作成を押す。
- REST APIで構築を押す。
- API名を入力して、APIの作成を押す。
- アクション -> リソースの作成で、リソース名にexecution と入力する。
- API Gateway CORS を有効にするにチェックを入れる。
- リソースを作成を押す。
- アクション -> メゾッドの作成で、POSTを選択し、チェックを押す。
- 統合タイプにAWS サービスを選択する。
- AWS リージョンに任意のリージョン、AWS サービスにStep Functionsを選択する。
- HTTP メソッドでPOSTを選択する。
- サクションにStartExecutionを入れる。
- 実行ロールに1.で作成したIAM ARNを入力する。
- 保存を押す。
- 統合リクエストを押す。
- マッピングテンプレートを開き、テンプレートが定義されていない場合 (推奨)を選択する。
- マッピングテンプレートの追加を押し、application/jsonもしくはmultipart/form-dataを入れて、チェックを押す。
- テンプレートの欄に以下を入力する。多くの場合、JSON形式の情報をリクエストするので、以下のマッピングテンプレートを使う。
application/json
#set($input = $input.json('$')) { "input": "$util.escapeJavaScript($input)", "stateMachineArn": "arn:aws:states:ap-northeast-1:000000000000:stateMachine:Get-Amazon-Infomation_StateMachine" }
multipart/form-data#set( $body = $util.escapeJavaScript($input.json('$')) ) { "input": "{\"body\":$body,\"requestContext\":{\"requestId\":\"$context.requestId\"},\"headers\":{\"content-type\":\"$input.params().header.get('content-type')\"}}", "stateMachineArn": "arn:aws:states:ap-northeast-1:501273628515:stateMachine:Get-Amazon-Infomation_StateMachine" }
- 保存を押す。
- HTTP ヘッダーを開き、ヘッダーの追加を押して、名前=Accept、マッピング元='/'と入力する。
- 統合レスポンス(Integration Response)を押す。
- ヘッダーマッピング(Header Mappings)にResponse header = Access-Control-Allow-Origin、Mapping value = '*'を入れる。
- 戻って、メゾッドレスポンス(Method Response)を押す。
- Response Headers for 200のNameにAccess-Control-Allow-Originを入れる。
- アクション -> CORSを許可する(Enable CORS)を押して、Enable CORS and replace existing CORS headersを押す。
- アクション -> APIのデプロイ新しいステージを選択し、ステージ名=devを入れて、デプロイする。
- ステージ -> POSTを押し、URL の呼び出しのURLから正常に呼び出せるか以下のコマンドで検証する。
curl -X POST https://asasdfvsd.execute-api.ap-northeast-1.amazonaws.com/dev/execution -H "Content-Type: application/json" -d "{\"ContentType\": \"applicastion/json\"}"
参考文献