スポンサーリンク

【Lambda】Python で function URLs の POST データを取得してみた

インフラ
たろ
たろ

Lambda function URLs 神アップデートやん!が、POSTデータってどうやって取得できるの?

こんな疑問にお答えします。

本記事の内容
  • Lambda function URLs を使ってみた!
  • POSTデータをPythonで受け取ってみた
スポンサーリンク

はじめに

こんにちはー。

神アップデートされたLambda function URLsを使ってみました!

これまでは API Gateway を駆使しめんどくさい設定を行なっていましたが Lambda で簡単にエンドポイントを作成できます!!!!!!!

ありがとうLambda!ありがとうAWS様!

てなわけで早速エンドポイントを作成しPOSTデータを受け取ってみます!

環境

  • AWS
  • Lambda
  • Python 3.9

AWS Lambda 作成

もろもろの設定は割愛します。下記の箇所を有効化だけしました。

  • 関数 URL を有効化

すでにエンドポイントがあること前提で話を進めます。

デフォルトのエンドポイントにアクセスしてみた

Lambda関数作成後、すぐに関数URLが生成される

このURLをブラウザで叩くと・・・

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

初期のコードがレスポンスされます。

Lambda – Python に POST リクエストを投げてみた

これまでのLambdaの使い方通り event 内にPOST情報が格納されているだろうと思い、まずは中身を確認します。

curl -X POST -H 'Content-Type: application/json' -d '{ "hoge": "fuga" }' https://hogehogefugafuga.lambda-url.region.on.aws/

POSTリクエストをターミナルで実行!

$ curl -X POST -H 'Content-Type: application/json' -d '{ "hoge": "fuga" }' https://hogehogefugafuga.lambda-url.region.on.aws/
# 以下の結果が戻ってきました(一部削除済み)
{
	"version": "2.0",
	"routeKey": "$default",
	"rawPath": "/",
	"rawQueryString": "",
	"headers": {
		"content-length": "18",
		"x-amzn-trace-id": "**************************************",
		"x-forwarded-proto": "https",
		"host": "**************************************",
		"x-forwarded-port": "443",
		"content-type": "application/json",
		"x-forwarded-for": "**************************************",
		"accept": "*/*",
		"user-agent": "curl/7.64.1"
	},
	"requestContext": {
		"accountId": "anonymous",
		"apiId": "**************************************",
		"domainName": "**************************************",
		"domainPrefix": "**************************************",
		"http": {
			"method": "POST",
			"path": "/",
			"protocol": "HTTP/1.1",
			"sourceIp": "**************************************",
			"userAgent": "curl/7.64.1"
		},
		"requestId": "**************************************",
		"routeKey": "$default",
		"stage": "$default",
		"time": "13/May/2022:03:17:05 +0000",
		"timeEpoch": **************************************
	},
	"body": "{ \"hoge\": \"fuga\" }",
	"isBase64Encoded": false
}

なるほどー!

"body": "{ \"hoge\": \"fuga\" }",

POSTしたデータを発見!!!

bodyにポストデータが格納されているようでした。

Python で POST データを取得するには

ここで素直に event[‘body’][‘hoge’] のような感じではエラーとなるので、以下のようにコードを書き換えます。

import json

def lambda_handler(event, context):
    # TODO implement
    body = json.loads(event['body'])
    hoge = body['hoge']
    return {
        'statusCode': 200,
        'body': json.dumps(hoge)
    }

もう一度リクエストを投げてみると・・・

$ curl -X POST -H 'Content-Type: application/json' -d '{ "hoge": "fuga" }' https://hogehogefugafuga.lambda-url.region.on.aws/
"fuga"

キーとバリューを認識して値を想定通りに返すことができました。

おわりに

まとめ
  • Lambda 新機能 Lambda function URLs を使ってみました
  • POSTデータを Lambda – Python で取得する方法を紹介しました
  • Lambda は 神!

コメント

タイトルとURLをコピーしました