通过API Gateway测试AWS Lambda时,使用Python出现错误。
通过API Gateway测试AWS Lambda时,使用Python出现错误。
我有一个基本的Lambda函数,它接受一个JSON,并将其转换为XML并上传到S3存储桶。我通过Lambda控制台运行测试,并且XML也生成并上传到S3。但是,当我通过API Gateway运行测试时出现问题,我收到以下错误:
"message": "内部服务器错误"和状态:502。错误还指出了代码的问题所在: {"errorMessage": "'header'", "errorType": "KeyError", "stackTrace": [" File \"/var/task/sample.py\", line 21, in printMessage\n b1.text = event['header']['echoToken']\n"]}
当通过Lambda控制台运行时,相同的代码是有效的。以下是引发错误的代码片段:
def printMessage(event, context): print(event) #event = json.loads(event['header']) root = ET.Element("Reservation") m1 = ET.Element("header") root.append(m1) b1 = ET.SubElement(m1, "echoToken") b1.text = event['header']['echoToken'] #此行引发错误
我在这里找到了一个类似的问题:
AWS Lambda-API gateway "message": "Internal server error" (502 Bad Gateway)。以下是event对象的打印输出。
{'header': {'echoToken': '907f44fc-6b51-4237-8018-8a840fd87f04', 'timestamp': '2018-03-07 20:59:575Z'}, 'reservation': {'hotel': {'uuid': '3_c5f3c903-c43d-4967-88d1-79ae81d00fcb', 'code': 'TASK1', 'offset': '+06:00'}, 'reservationId': 12345, 'confirmationNumbers': [{'confirmationNumber': '12345', 'source': 'ENCORA', 'guest': 'Arturo Vargas'}, {'confirmationNumber': '67890', 'source': 'NEARSOFT', 'guest': 'Carlos Hernández'}], 'lastUpdateTimestamp': '2018-03-07 20:59:541Z', 'lastUpdateOperatorId': 'task.user'}}
根据链接中的解决方案,如果我尝试执行:header = json.loads(event['header'])
我会收到以下错误:
"errorMessage": "JSON对象必须是str、bytes或bytearray,而不是dict",
这是我需要完成的任务,我已经尝试了一些方法,但在通过API Gateway和POSTMAN进行测试时始终失败。所以,我的问题是:我不想改变我完整的XML转换代码,有没有办法在Python中加载完整的event对象,以便它既可以通过Lambda控制台又可以通过API Gateway工作?
提前感谢!
问题原因:在AWS Lambda中,通过API Gateway测试时出现了错误。错误信息是"the JSON object must be str, bytes or bytearray, not dict",意味着传递给Lambda函数的事件参数event应该是字符串、字节或字节数组类型,而不是字典类型。
解决方法:根据问题描述,可以看到问题的解决方法是将事件参数event从字典类型转换为字符串类型,然后再将其转换回字典类型。下面是修改后的代码:
eventDict = json.dumps(event) event = json.loads(eventDict)
这样做的目的是将字典类型的event转换为字符串类型,然后再将其转换回字典类型,以便在Lambda函数中使用event作为字典来获取所需的值。
在AWS Lambda中,XML生成正常,并且将其上传到S3存储桶时没有问题。但是,通过API Gateway进行测试时,会导致相同的错误"errorType": "KeyError",错误堆栈中指出了问题出现的位置。根据堆栈跟踪,问题出现在`b1.text = event['header']['echoToken']`这一行代码中。
根据问题描述以及提供的解决方法,可以得出以下结论:问题出现的原因是事件参数event的数据类型错误,应该将其从字典类型转换为字符串类型并再次转换回字典类型。这样做后,问题得到了解决。
文章结束。