7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-08-29

概要

この記事では、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 クエリ文字列パラメータ」を設定

2020-08-29_12h30_42.png
API Gatewayの「リソース」を開く
② 該当メソッドを選択
image.png
③「メソッドリクエスト」の編集画面に入る
2020-08-29_12h36_45.png
2020-08-29_12h37_49.png
④⑤⑥⑦URL クエリ文字列パラメータとして取得したい(認識して欲しい)パラメータ名を設定(今回ならhogeと入力した)

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

2020-08-29_12h43_59.png
①該当メソッドの「統合リクエスト」を選択
image.png
②「Lambdaプロキシ統合の使用」にチェックを入れる

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

2020-08-29_12h47_47.png
①②「APIのデプロイ」を選択
image.png
③「デプロイされるステージ」を選択
④「デプロイ」実行

補足

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

ちなみに、私の場合は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

image.png

感想

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

関連記事

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

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

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?