
半年ぶりの記事となります。 たまたま、AWS Step Functions についていくつか調査する機会があったので久々に記事にまとめようと思い立ちました。
タイトルの処理を実装する手順をまとめていきますが、Amazon API Gateway から AWS Step Functions のステートマシンを非同期で呼び出す手順は AWS の公式ドキュメントに手順が記載されています。
この処理は、下図のような仕組みで実現できます。

ただ、同期的に呼び出す手順については明確には記載されていないので、この記事にまとめていきます。
Agenda
今回実装する処理
今回は、Amazon API Gateway の API にクエリパラメータ yourname で指定した名前に、Hello というメッセージをつけて同期的に返す処理を実装していきます。

ステートマシンの実装
AWS Step Functions のステートマシンは、この処理を実現する最低限の実装にしています。具体的には、Express タイプ のステートマシンで、Pass ステートだけを使用し、レスポンスとなるメッセージにステートマシンのパラメータの値を設定して出力します。
{ "Comment": "A description of my state machine", "StartAt": "Pass", "States": { "Pass": { "Type": "Pass", "Parameters": { "message.$": "States.Format('Hello, {} !', $.yourname)" }, "End": true } } }

Express タイプのステートマシンは、同期または非同期で呼び出せます。Express タイプと 標準タイプの違いは下記のドキュメントにまとまっています。
Amazon API Gateway の設定
リクエストの処理について下図のように設定していきます。

まず、下記を参考に API から ステートマシンを実行する許可を与えるための IAM ロールを作成しておきます。
次に REST API を新規に作成します。リソースの設定は任意ですが、メソッドは GET を作成します。
統合リクエストでは、下表のように設定します。同期リクエストの場合は アクション名に StartSyncExecution を指定するのがポイントです。
| 設定項目 | 設定内容 |
|---|---|
| 統合タイプ | AWS のサービス |
| AWS リージョン | (使用しているリージョン) |
| AWS のサービス | Step Functions |
| HTTP メソッド | POST |
| アクション名 | StartSyncExecution |
| 実行ロール | (作成した実行ロールの ARN) |

そして、統合リクエストのマッピングテンプレートで下記を設定します。これは、yourname というクエリパラメータ の値をステートマシンに渡す JSON に変換しています。stateMachineArn には作成したステートマシンの ARN を設定します。
コンテンツタイプ は、application/json
{ "input": "{ \"yourname\": \"$input.params('yourname')\"}", "name": "MySyncExecution", "stateMachineArn": "arn:aws:states:ap-northeast-1:123456789012:stateMachine:sfnsync-statemachine" }
次に、下図のように統合レスポンスのマッピングテンプレートを設定します。この設定により、ステートマシンが出力した内容だけを API の呼び出しもとに返すようにできます。

コンテンツタイプ は、application/json
$input.path('$.output')
以上で API の設定は完了です。
テスト実行
では、AWS マネジメントコンソールのテストの機能を使って、API から ステートマシンを呼び出してみましょう
[テスト] タブをクリックして、[クエリ文字列] に yourname=John Doe と入力し、[テスト] をクリックします。

レスポンスとして下図のように表示されれば OK です!

作成した API をデプロイする場合は、[API をデプロイ] をクリックし、ステージを指定してデプロイします。
最後に
Express タイプのステートマシンだと短時間の処理を同期的に呼び出すケースもありえますが、Amazon API Gateway を使った場合の同期的な呼び出しも問題なく行えることがわかりました。 ただ、マッピングテンプレートを活用する必要があるので、下記のドキュメントなどで理解を深めておくことも重要ですね。