我正在创建一个简单的Lambda函数来为AWS Gateway中的POST提供服务:
import json
import boto3
from datetime import datetime
def lambda_handler(event,context):
wf = event['WF']
if wf == 'start1':
body = 'Suceeded'
return {
"isBase64Encoded": False,
'statusCode': 200,
'body': json.dumps(body),
'headers': {
'Content-Type': 'application/json'
}
}
else:
body = 'Failed'
return {
"isBase64Encoded": False,
'statusCode': 400,
'body': json.dumps(body),
'headers': {
'Content-Type': 'application/json'
}
}
如果成功发送包含此正文的POST:
{
"WF": "start1",
"Context": "OK"
}
退货:
Test Event Name
test
Response
{
"isBase64Encoded": false,
"statusCode": 200,
"body": "\"Suceeded\"",
"headers": {
"Content-Type": "application/json"
}
}
Function Logs
START RequestId: 91663a9d-d8b6-4aad-b8b6-eb2f15ff0354 Version: $LATEST
END RequestId: 91663a9d-d8b6-4aad-b8b6-eb2f15ff0354
REPORT RequestId: 91663a9d-d8b6-4aad-b8b6-eb2f15ff0354 Duration: 1.74 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 66 MB Init Duration: 300.73 ms
Request ID
91663a9d-d8b6-4aad-b8b6-eb2f15ff0354
但如果我在AWS的API Gateway服务中运行测试,我会得到:
Fri Jun 04 13:45:22 UTC 2021 : Sending request to https://XXXXXXX
Fri Jun 04 13:45:22 UTC 2021 : Received response. Status: 200, Integration latency: 15 ms
Fri Jun 04 13:45:22 UTC 2021 : Endpoint response headers: {Date=Fri, 04 Jun 2021 13:45:22 GMT, Content-Type=application/json, Content-Length=159, Connection=keep-alive, x-amzn-RequestId=d479fdac-6737-42fa-96a3-9e991056b48d, X-Amz-Function-Error=Unhandled, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=1-60ba2e72-ff62f051febbd21d6cc9d114;sampled=0}
Fri Jun 04 13:45:22 UTC 2021 : Endpoint response body before transformations: {"errorMessage": "'WF'", "errorType": "KeyError", "stackTrace": [" File \"/var/task/lambda_function.py\", line 7, in lambda_handler\n wf = event['WF']\n"]}
Fri Jun 04 13:45:22 UTC 2021 : Lambda execution failed with status 200 due to customer function error: 'WF'. Lambda request id: d479fdac-6737-42fa-96a3-9e991056b48d
Fri Jun 04 13:45:22 UTC 2021 : Method completed with status: 502
为什么第7行是错的?有没有别的方法来解析POST的主体?
3条答案
按热度按时间sshcrbum1#
已通过在POST -集成请求中禁用Lambda代理集成找到解决方案。
slmsl1lt2#
看起来你的API Gateway调用没有填充Lambda函数的
event
参数。当你在lambda函数的页面上创建一个测试事件时,你可以创建自己的测试事件。API Gateway不会使用这个测试事件,而是发送一个空事件(可能为null)。即
wj8zmpe13#
在我的例子中,我在通过API网关调用Lambda函数时收到了这个错误,当直接调用期望简单JSON主体的lambda函数时也完全没有问题。
我的预期载荷:
{"Email": "foo3@foo.com"}
原来配置API网关中的
Lambda Proxy Integration in the POST
在传递到Lambda之前更改了负载结构,我得到了缺少Key属性Email
的错误。我注意到cloudwatch中的Endpoint request body after transformations:
行,所以我深入研究了它更改请求正文的原因。调试方式:
POST
和GET
,看到相同的错误,因为Email
丢失是关键,因为我已经在POST的请求主体中传递了有效负载。