結論
- API Gatewayで設定したマッピングテンプレートの内容でそのまま渡していける
- POSTなどでリクエストされた際にリクエストBodyをそのまま後続処理のインプットにできる
背景
先日、ブログの記事投稿に連動して自動ツイートする仕組みを作りました。
下記のような仕組みです。
- API GatewayでWeb APIを用意する
- Web APIへのリクエストでStep FunctionsのWorkflowを実行させる
- Step FunctionsのWorkflowで一定時間スリープ後、ツイート処理のLambda関数を実行する
この仕組みを作るにあたって、Web APIへPOSTされたリクエストパラメータがどのように後続処理に渡されていき、どのような形で参照可能なのか把握するのに手こずりました。
同じような人がいるかもしれないので記事にした次第です。
詳細
背景に記載しているのと同じように、Web APIでPOSTされたリクエストパラメータをStep Functionsおよび、その中で実行されるLambdaに渡していく例を見ていきます。
API Gateway
マッピングテンプレートに入力する前準備で下記を実行してください。
- REST APIでAPIを作成して、POSTのメソッドを追加する
- 追加したメソッドのページから、
統合リクエスト
のリンクをクリックする マッピングテンプレート
のアコーディオンを展開するリクエスト本文のパススルー
をテンプレートが定義されていない場合 (推奨)
にするマッピングテンプレートの追加
をクリックするContent-Type
にapplication/json
を入力する作成
(チェックマークの)ボタンをクリックする
ここまで実行したら、下部に表示された入力欄に下記のJSONを記述してください 。
{
"input": "$util.escapeJavaScript($input.json('$'))",
"stateMachineArn": "[Step FunctionsのステートマシンのARN]"
}
この内容がマッピングテンプレートになります。
key:input
のvalueの内容が後続処理のStep Functionsに渡されていきます。
ここではリクエストパラメータをJSONとして指定しています。
Step Functions
Step Functionsでアクションを追加すると、入力や出力のオプションがあります。
これによって受け取ったインプット、またはアクションからのアウトプットの内容から必要な部分だけにフィルタリングすることもできますが、基本的にはデフォルトの設定通り指定無しで良いです。
とくに操作しなければそのままの値で次のアクションにも入力されます。
Lambda
Step Functionsのアクションとして実行されたLambda関数の処理では、インプットの内容をそのまま引数として受け取れます。
言語にGoを使って記述した例です。
package main
import (
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
type Input struct {
A string `json:"a"`
B string `json:"b"`
}
func main() {
lambda.Start(hoge)
}
func hoge(i Input) {
fmt.Println(i.A)
fmt.Println(i.B)
}
lambda.Start()
で実行された関数の引数として構造体型を指定すると、インプットをJSONデコードした値を取得できます。
おわり
意外とこういう情報って公式ドキュメントとか見ても分からなかったりしますよね。