datsukan blog
🔣

AWSでAPI Gateway→Step Functions→Lambdaと実行した場合にリクエストのデータがどのように渡されるか

この記事は投稿してから1年以上が経過しています。

結論

  • API Gatewayで設定したマッピングテンプレートの内容でそのまま渡していける
  • POSTなどでリクエストされた際にリクエストBodyをそのまま後続処理のインプットにできる

背景

先日、ブログの記事投稿に連動して自動ツイートする仕組みを作りました。

下記のような仕組みです。

  1. API GatewayでWeb APIを用意する
  2. Web APIへのリクエストでStep FunctionsのWorkflowを実行させる
  3. Step FunctionsのWorkflowで一定時間スリープ後、ツイート処理のLambda関数を実行する

この仕組みを作るにあたって、Web APIへPOSTされたリクエストパラメータがどのように後続処理に渡されていき、どのような形で参照可能なのか把握するのに手こずりました。
同じような人がいるかもしれないので記事にした次第です。

詳細

背景に記載しているのと同じように、Web APIでPOSTされたリクエストパラメータをStep Functionsおよび、その中で実行されるLambdaに渡していく例を見ていきます。

API Gateway

マッピングテンプレートに入力する前準備で下記を実行してください。

  1. REST APIでAPIを作成して、POSTのメソッドを追加する
  2. 追加したメソッドのページから、統合リクエストのリンクをクリックする
  3. マッピングテンプレートのアコーディオンを展開する
  4. リクエスト本文のパススルーテンプレートが定義されていない場合 (推奨)にする
  5. マッピングテンプレートの追加をクリックする
  6. Content-Typeapplication/jsonを入力する
  7. 作成(チェックマークの)ボタンをクリックする

ここまで実行したら、下部に表示された入力欄に下記のJSONを記述してください。

{
    "input": "$util.escapeJavaScript($input.json('$'))",
    "stateMachineArn": "[Step FunctionsのステートマシンのARN]"
}

この内容がマッピングテンプレートになります。
key:inputのvalueの内容が後続処理のStep Functionsに渡されていきます。
ここではリクエストパラメータをJSONとして指定しています。

Step Functions

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デコードした値を取得できます。

おわり

意外とこういう情報って公式ドキュメントとか見ても分からなかったりしますよね。

コメント
 
URLをコピーしました
Profile picture
datsukan

24歳。埼玉県在住。東京都のSaaS企業でバックエンドエンジニアとして勤務しています。

© 2022 datsukan