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関数にクエリ文字列のパラメータを渡すことができました。