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

  • 79
    Like
  • 0
    Comment
More than 1 year has 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関数にクエリ文字列のパラメータを渡すことができました。

参考