Web制作・開発会社 プレスマンのスタッフブログ

PRESSMAN*Tech

【AWS API Gateway】リクエストのマッピングについて

ドキュメントをざっと読んだところ$inputについての記述が見つからなかったのでまとめ。

リクエスト時の$inputはクエリ、ヘッダ、POSTのbody等々色々と入っているよく分からない変数です。
API GatewayのIntegration Requestでinput mappingをするとlambda関数の一つ目の引数に渡されるようになります。

パス、クエリ、ヘッダから値をlambdaへ渡す場合

$input.params('[名前]')で取得出来ます。

パスはResourceを /test/{xxxxx} の様に作成します。
クエリはMethod Executionの画面->Method Request->URL Query String Parameters->Add query stringで追加します。
ヘッダはクエリ追加と同じ画面でHTTP Requery Headers->Add headerで追加します。

POSTしたbodyから渡す場合

$input.path('$')にbodyのJSONがパースされて入ります。

Resourceを /test/{user_id}, MethodをPOSTでつくってLambda関数に紐付けます。
紐付けるLambda関数は渡された引数を表示するだけの簡単なものです。

[javascript]
exports.handler = function(event, context) {
context.succeed(event);
};
[/javascript]

画像の様にクエリ、ヘッダを設定します。

Integration Requestのinput mappingで下記のとおり記述します。
その際にContent-Typeの項目にはapplication/jsonと入力下さい。placeholderでapplication/jsonと設定されていますが、ちゃんと入力しないとダメです。
それと、オブジェクトの値の方はダブルクォーテーションで囲まないと実行時にパースエラーが出ます。
[javascript]
{
"user_id": "$input.params('user_id')",
"user_name": "$input.params('user_name')",
"x-test": "$input.params('X-TEST')",
"path": "$input.path('$')",
"hoge": "$input.path('$').hoge"
}
[/javascript]

その後テスト実行です。色々とパラメーターを入れて実行してみて下さい。

"path": "$input.path('$')" はRequest Bodyをパースしてオブジェクトとして入ると思いましたが、そうはいかないようですね。イコールでくっつけたテキストになってしまいました。マッピングするのも面倒なのでヘッダ、クエリ、Request body全部まとめて渡してくれると嬉しいですね。