API Gatewayへの入力値にLambdaからアクセスする

Amazon API GatewayとAWS Lambdaを組み合わせて利用しているときに、リクエストヘッダやURLクエリパラメータなどの入力値にLambdaのコードからアクセスできるようにする方法について説明します。

Integration Requestを選ぶ

image

Mapping Templatesを選ぶ

image

テンプレートを作成する

application/json用のテンプレートを作成します。

image

テンプレートを編集する

内容は以下の通りです。執筆時点で API Gatewayのドキュメント で説明されている全ての値を参照できるようにしてみました。このテンプレートはVTLという言語で記述することになっているので、詳しく知りたい人は ユーザガイド を見ると良いです。

``` { "accountId": "$context.identity.accountId", "apiId": "$context.apiId", "apiKey": "$context.identity.apiKey", "caller": "$context.identity.caller", "headers": {

foreach( $key in $input.params().header.keySet() )

"$key": "$input.params().header.get($key)"#if( $foreach.hasNext ),#end

end

}, "httpMethod": "$context.httpMethod", "path": "$context.resourcePath", "pathParameters": {

foreach( $key in $input.params().path.keySet() )

"$key": "$input.params().path.get($key)"#if( $foreach.hasNext ),#end

end

}, "queryParameters": {

foreach( $key in $input.params().querystring.keySet() )

"$key": "$input.params().querystring.get($key)"#if( $foreach.hasNext ),#end

end

}, "requestId": "$context.requestId", "requestParameters": $input.json('$'), "resourceId": "$context.resourceId", "sourceIp": "$context.identity.sourceIp", "stage": "$context.stage", "user": "$context.identity.user", "userAgent": "$context.identity.userAgent", "userArn": "$context.identity.userArn" } ```

おわり

以上の設定を反映させると、Lambdaのeventオブジェクトとしてこれらの値が渡されるようになります。

js exports.handler = function (event, context) { context.succeed(event); };