概要
HTTPでPOSTした際に、
AWS Lambdaのevent
の中身はどういう形式か調査したので、共有する。
curl -X POST -H "Content-Type: application/json" -d '{"Name":"Tanaka", "Age":"100"}' <api-url>
結論
event
の中身は、以下の設定によって変わる。
-
lambda統合プロキシ
を使用している場合 - それ以外の場合
どこで設定するのかも詳しくみる。
A : 設定値によりevent
が変わるパターン
1 : lambdaプロキシ統合
を使用している場合
REST API
を使用している場合、
lambdaプロキシ統合
を使用しているかどうか以下で判断できる。
チェックがついてる場合、
event
は以下のjsonになる。
{
"version": "2.0",
"routeKey": "$default",
"rawPath": "/my/path",
"rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value",
"cookies": [
"cookie1",
"cookie2"
],
"headers": {
"Header1": "value1",
"Header2": "value1,value2"
},
"queryStringParameters": {
"parameter1": "value1,value2",
"parameter2": "value"
},
"body": "Hello from Lambda",
"pathParameters": {
"parameter1": "value1"
},
"isBase64Encoded": false,
"stageVariables": {
"stageVariable1": "value1",
"stageVariable2": "value2"
}
"requestContext": {
"accountId": "123456789012",
"apiId": "api-id",
"authentication": {
"clientCert": {
"clientCertPem": "CERT_CONTENT",
"subjectDN": "www.example.com",
"issuerDN": "Example issuer",
"serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
"validity": {
"notBefore": "May 28 12:30:02 2019 GMT",
"notAfter": "Aug 5 09:36:04 2021 GMT"
}
}
},
"authorizer": {
"jwt": {
"claims": {
"claim1": "value1",
"claim2": "value2"
},
"scopes": [
"scope1",
"scope2"
]
}
},
"domainName": "id.execute-api.us-east-1.amazonaws.com",
"domainPrefix": "id",
"http": {
"method": "POST",
"path": "/my/path",
"protocol": "HTTP/1.1",
"sourceIp": "IP",
"userAgent": "agent"
},
"requestId": "id",
"routeKey": "$default",
"stage": "$default",
"time": "12/Mar/2020:19:03:58 +0000",
"timeEpoch": 1583348638390
}
}
つまり、bodyを取得したい場合は以下のコードでOK。
def lambda_handler(event, context):
body = event["body"]
print(body) # => {"Name":"Tanaka", "Age":"100"}
2 : それ以外の場合
マッピングテンプレート
の設定値に準拠する。
lambdaプロキシ統合
を下にスクロールすると、次の画面が現れる。
最も上の設定だと、そのまま通過する。
つまりbody
を以下のように取得できる。
def lambda_handler(event, context):
print(event) # => {"Name":"Tanaka", "Age":"100"}
マッピングテンプレート
を追加すると、eventsの情報を自分好みに変えることが可能。
詳しくはこちらの記事で。
https://dev.classmethod.jp/articles/api-gateway-mapping-template/
HTTP APIの場合は?
API GatewayにはREST API
だけでなく、HTTP API
もある。
HTTP API
の場合は、lambdaプロキシ統合
に準拠してるっぽい(?)。
僕は設定値変えるところを見つけられなかった。