通过API Gateway测试AWS Lambda时,使用Python出现错误。

7 浏览
0 Comments

通过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工作?

提前感谢!

0
0 Comments

问题原因:在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的数据类型错误,应该将其从字典类型转换为字符串类型并再次转换回字典类型。这样做后,问题得到了解决。

文章结束。

0