概要
この記事では、http://example.com/books/1?hoge=2というリクエストURL内のhoge=2の部分、もしくは2のことをqueryStringParameter(URL クエリ文字列パラメータ)と呼びます。
この、queryStringParameterをAPI Gateway経由でAWS Lambdaに渡すための設定を記載しました。
前提・対象者
- 既に
API Gateway経由でAWS Lambdaの関数を呼び出すことは成功している - リクエストURLの末尾に
queryStringParameterを記載しているのに、Lambda関数内で取得できない
この状況に陥っている方向けの記事になります。
(私がこの状態で2時間程度悩みました....)
症状
本来であれば、lambdaのhandler関数のevent引数にqueryStringParameterが渡されるはずなのにもかかわらず、event引数の中身が空っぽの辞書になってしまう。
def lambda_handler(event, context):
print(event) # <- こうしておけば CloudWatch の EventLog で確認できる
return {
'statusCode': 200,
'headers': {
# INFO: CORS関係のエラー回避のために必要
'Access-Control-Allow-Origin': '*'
},
# 普通こんなことしないけど、結果を見るために設定
'body': json.dumps(event)
}
// お好みのブラウザの開発者ツールで実行できます
>> 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の「リソース」を開いた上で以下の項目を操作しました。
- 該当「メソッドリクエスト」で「URL クエリ文字列パラメータ」を設定
- 該当メソッドの「統合リクエスト」で「Lambda プロキシ統合の使用」にチェックを入れる
- 「アクション」のうち「APIのデプロイ」を実行
方法の詳細
1. 該当「メソッドリクエスト」で「URL クエリ文字列パラメータ」を設定

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

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


④⑤⑥⑦URL クエリ文字列パラメータとして取得したい(認識して欲しい)パラメータ名を設定(今回ならhogeと入力した)
2. 該当メソッドの「統合リクエスト」で「Lambda プロキシ統合の使用」にチェックを入れる

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

②「Lambdaプロキシ統合の使用」にチェックを入れる
3. 「アクション」のうち「APIのデプロイ」を実行

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

③「デプロイされるステージ」を選択
④「デプロイ」実行
補足
デプロイ実行直後だと、デプロイ前の状態が維持されていることがある。
反映まではタイムラグがあるとみてよさそう。
ちなみに、私の場合は1~3分程度で反映された。
結果
>> 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サービスの使い方の勉強をしないとやっていけなくなってきた。
全然使い方がわからない(´;ω;`)
関連記事
以下の記事には別のやり方が書いてある。
- Amazon API GatewayでAWS Lambda関数にクエリ文字列をパラメータとして渡す
- How to pass a querystring or route parameter to AWS Lambda from Amazon API Gateway
どちらの方法もやり方がわからなかったのであきらめたのですが、おそらく「Lambda プロキシ統合の使用」をしない場合に、「統合リクエスト」編集ページに表示されている箇所の入力が必要になると思われる。
