概要
この記事では、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 プロキシ統合の使用」をしない場合に、「統合リクエスト」編集ページに表示されている箇所の入力が必要になると思われる。