Help us understand the problem. What is going on with this article?

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

参考

yuyakato
株式会社那由多屋の代表取締役社長です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした