AWS
lambda
APIGateway

Amazon API GatewayでAWS Lambda関数にクエリ文字列をパラメータとして渡す

More than 3 years have passed since last update.

2015年7月にAWSより新たに発表されたサービス「Amazon API Gateway」(以下、API Gateway)。

同じくAWSのサービスである「AWS Lambda」(以下、Lambda)の関数を簡単にAPIとして公開することができますが、Lambda関数にパラメータを渡す方法で少し悩んだので、メモを残しておきます。


0. 結論

結論から述べると、「Integration Request」の「Input mapping」を設定することで、クエリ文字列をLambda関数のパラメータとして渡すことができます。クエリ文字列の「foo」パラメータを、Lambda関数の「foo」パラメータとして渡す例は以下の通り。

{

"foo": "$input.params('foo')"
}


1. Lambda関数を準備する

結論は前述の通りですが、検証方法について以下に示します。

まず、検証用のLambda関数を作成します。今回は以下のコードを使用しました。パラメータが含まれるeventオブジェクトを、そのままレスポンスとして返すだけの簡単なコードです。

exports.handler = function(event, context) {

console.log(JSON.stringify({event: event, context: context}, null, 2));
context.succeed({event: event});
};


2. API Gatewayのメソッドを準備する

検証用に(API Gatewayで言うところの)API、メソッドを作成します。リソース、モデルについては、今回は不要です。

Lambda関数をAPIとして公開したいので「Integration Type」は「Lambda Function」を選択し、Lambda関数が配置されているリージョン、Lambda関数の名称を入力します。


3. パラメータのマッピングを設定する


3.1. 設定前のテスト

この段階でメソッドのテストを行うと、Lambda関数は以下のレスポンスを返します。パラメータを何も渡していないため、空のオブジェクトが返ります。

{

"event": {}
}


3.2. 固定値を渡すテスト

クエリ文字列を渡す前に、固定値をパラメータとして渡すことができるかどうか確認しました。

メソッドの画面から「Integration Request」に遷移し、「Templates」の「Content-Type」に「application/json」を、「Input mapping」に以下のコードを入力します。

{

"foo": "abc"
}

上記の設定を行ってからメソッドのテストを行うと、Lambda関数は以下のレスポンスを返します。



{
"event": {
"foo": "abc"
}
}

無事、固定値がLambda関数のパラメータとして渡りました。


3.3. パラメータの追加

まずはメソッドにパラメータを追加します。メソッドの画面から「Method Request」に遷移し、「URL Query String Parameters」にてクエリ文字列として与えることができるパラメータを追加します。

今回は「foo」を追加しました。

この段階でメソッドのテストを行っても、テスト画面からは「foo」パラメータを入力することができますが、Lambda関数は相変わらず固定値を返します。

{

"event": {
"foo": "abc"
}
}


3.4. パラメータのマッピングの設定

メソッドの画面から「Integration Request」に遷移し、「Input mapping」に以下のコードを入力します。

{

"foo": "$input.params('foo')"
}

上記の設定後、メソッドのテストを行うと、テスト画面に入力した「foo」パラメータがLambda関数に渡ります。「foo」の値として「123」を入力した場合のレスポンスは以下の通り。

{

"event": {
"foo": "123"
}
}

無事、Lambda関数にクエリ文字列のパラメータを渡すことができました。


参考