[AWS Lambda / API Gateway] queryStringParameter(URL クエリ文字列パラメータ) をLambda関数内で取得する


概要

この記事では、http://example.com/books/1?hoge=2というリクエストURL内のhoge=2の部分、もしくは2のことをqueryStringParameter(URL クエリ文字列パラメータ)と呼びます。

この、queryStringParameterAPI Gateway経由でAWS Lambdaに渡すための設定を記載しました。

前提・対象者

  • 既にAPI Gateway経由でAWS Lambdaの関数を呼び出すことは成功している
  • リクエストURLの末尾にqueryStringParameterを記載しているのに、Lambda関数内で取得できない

この状況に陥っている方向けの記事になります。
(私がこの状態で2時間程度悩みました....)

症状

本来であれば、lambdaのhandler関数のevent引数にqueryStringParameterが渡されるはずなのにもかかわらず、event引数の中身が空っぽの辞書になってしまう。

app_name/lambda_function.py

def lambda_handler(event, context):
    print(event) # <- こうしておけば CloudWatch の EventLog で確認できる
    return {
        'statusCode': 200,
        'headers': {
            # INFO: CORS関係のエラー回避のために必要
            'Access-Control-Allow-Origin': '*'
        },
        # 普通こんなことしないけど、結果を見るために設定
        'body': json.dumps(event)
    }
APIGatewayへのリクエスト
// お好みのブラウザの開発者ツールで実行できます
>> const API_URL = 'https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/default/tradehist'
>> var response = fetch(API_URL + '?hoge=123').then(response => response.json())
>> response

結果は、responseの中身を見ても、そもそもqueryStringParametersのkeyすらない...。

対策

event引数にqueryStringParametersが含まれるようにするため、以下のことを実施

方法の概要

API Gatewayの「リソース」を開いた上で以下の項目を操作しました。

  1. 該当「メソッドリクエスト」で「URL クエリ文字列パラメータ」を設定
  2. 該当メソッドの「統合リクエスト」で「Lambda プロキシ統合の使用」にチェックを入れる
  3. 「アクション」のうち「APIのデプロイ」を実行

方法の詳細

1. 該当「メソッドリクエスト」で「URL クエリ文字列パラメータ」を設定


API Gatewayの「リソース」を開く
② 該当メソッドを選択

③「メソッドリクエスト」の編集画面に入る


④⑤⑥⑦URL クエリ文字列パラメータとして取得したい(認識して欲しい)パラメータ名を設定(今回ならhogeと入力した)

2. 該当メソッドの「統合リクエスト」で「Lambda プロキシ統合の使用」にチェックを入れる


①該当メソッドの「統合リクエスト」を選択

②「Lambdaプロキシ統合の使用」にチェックを入れる

3. 「アクション」のうち「APIのデプロイ」を実行


①②「APIのデプロイ」を選択

③「デプロイされるステージ」を選択
④「デプロイ」実行

補足

デプロイ実行直後だと、デプロイ前の状態が維持されていることがある。
反映まではタイムラグがあるとみてよさそう。

ちなみに、私の場合は1~3分程度で反映された。

結果

APIGatewayへ再リクエスト
>> const API_URL = 'https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/default/tradehist'
>> var response = fetch(API_URL + '?hoge=123').then(response => response.json())
>> response

感想

ITの勉強というより、AWSサービスの使い方の勉強をしないとやっていけなくなってきた。
全然使い方がわからない(´;ω;`)

関連記事

以下の記事には別のやり方が書いてある。

どちらの方法もやり方がわからなかったのであきらめたのですが、おそらく「Lambda プロキシ統合の使用」をしない場合に、「統合リクエスト」編集ページに表示されている箇所の入力が必要になると思われる。