lambdaでAPI Gateway経由のquerystringを取得する(Python)


はじめに

AWS Lambdaを初めて触ってみました。
QueryStringを取得して、レスポンスを返すことがあっという間にできたのでメモです。

環境

最初は使っているWindowsにすでにインストールされているバージョンに合わせるためにPython3.6を使用しました。
ですが、Lambdaだとローカルでテストが不要なのでバージョンを合わせる必要はありませんでした。
AWS上で現時点でサポートされる最新のバージョンを使っていいと思います。
(処理がシンプルすぎるので当たり前ですが、Python 3.8で作り直してもうまく動きました。)

まとめ

event['queryStringParameters']['name'] でできます。

構築

AWS アカウント取得

なんと、ほぼ触ったことがなかったのでアカウント作成からやりました。

課金時の通知

課金されたら知りたいので、予算を登録して、$1で通知が来るように設定しました。
課金されてないので、通知が来るようになっているのかどうかよくわかりません。

Lambda の作成

サービスからLambdaを開きます。
お試しなのでサクッと作成します。

harowa できました。

API Gateway の作成

トリガーを追加をクリックして、さささーっと作ります。

REST APIにすると、POST,PATCH,DELETEとかを受け取れるんですかね。
やったことないのでわかりません!

出来ました。

もうインターネット上に乗ってることを確認する

ここで一度API GatewayとLambdaが連携できてることを実感しましょう。
API GatewayAPIエンドポイントにあるURLをクリックします。

どこがインターネット上に公開しちゃいけない情報なのかわからなかったので、よくわかんない情報は塗りつぶしました。

ブラウザ上に"Hello from Lambda!"って表示されたかと思います。
はやーって感じですね。

QueryStringを出力するように変更

Lambdaを開きます。
すると、下に関数のエディターが開きます。

ここで以下のようにソースをいじります。

querystring_sample
import json

def lambda_handler(event, context):
    # TODO implemen
    name = event['queryStringParameters']['name']
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!' + name)
    }

変更したら、Save!!
以下、変更点です。

  • name = event['queryStringParameters']['name']を追加
  • 'body':~のところに+ nameを追加しています。

eventの構造については、こちらのページを参考にしました。
他のサービスで AWS Lambda を使用する

あとは、API GatewayのAPIエンドポイントのURLの末尾に?name=wakoitと追加してアクセスすればOK!
ブラウザに"Hello from Lambda!wakoit"と表示されました!

その他

querystringを指定されなかった場合に、Internal Server Errorになってしまうので、実際に使う場合は例外処理などをきちんと入れる必要がありますね。

Lambdaのfunctionのテストを何も考えずに作るとエラーで機能しなくなるので、querystringを渡すようなテストを作る等の対応が必要そうです。
(そこまで試していません)

まとめ

サーバーレス楽しいですね。
インフラエンジニアとしては、ちょっと怖いですけど。
データベースプロキシの機能を使って、データベースに書き込むこともできそうなので、お手軽にAPIサーバーを建てることができそうですごいですね!

悪意のあるアクセスがいっぱい来て、Lambdaの無料枠消化されたら怖いのでfunctionは削除しましたとさ^^