【问题标题】:Error in AWS lambda with python when testing through API Gateway通过 API Gateway 进行测试时,使用 python 的 AWS lambda 出错
【发布时间】:2021-07-24 06:53:53
【问题描述】:

我有一个基本的 lambda 函数,它接受 JSON,并转换为 XML 并将其上传到 s3 存储桶。我正在通过 lambda 控制台运行测试,并且 xml 也正在生成并上传到 s3。当我通过 API Gateway 运行测试时出现问题,并且出现错误:

"message": "Internal server error" and Status: 502. The error also points out where is the code issue:
{"errorMessage": "'header'", "errorType": "KeyError", "stackTrace": ["  File \"/var/task/sample.py\", line 21, in printMessage\n    b1.text = event['header']['echoToken']\n"]}

通过 lambda 控制台运行相同的代码。下面是代码 sn-p 与引发错误的行:

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'] #this line throws error

我在这里遇到了类似的问题: AWS Lambda-API gateway "message": "Internal server error" (502 Bad Gateway)。下面是事件对象的打印。

{'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": "the JSON object must be str, bytes or bytearray, not dict",

这是我需要完成的任务,我尝试了一些事情,但通过 API Gateway 和 POSTMAN 测试时总是失败。所以,我的问题是:我不想更改 XML 转换的完整代码,有什么方法可以在 python 中加载完整的事件对象,以便它可以通过 lambda 控制台和 API 网关工作?

提前致谢!!

【问题讨论】:

  • 那个事件对象看起来被篡改了,应该是headers而不是header
  • 提供给我的 JSON 文件,将其作为标头。

标签: python-3.x aws-lambda aws-api-gateway


【解决方案1】:

问题与here讨论的问题类似

以下代码将修复导致问题的行。

eventDict = json.loads(event)
b1Text = json.dumps(eventDict['header']['echoToken'])

print(b1Text)

【讨论】:

  • 我确实尝试了上述选项,但是当我在 lambda 控制台中运行时它给出了 sn 错误。以下是错误:“errorMessage”:“JSON 对象必须是 str、bytes 或 bytearray,而不是 dict”,
  • 我检查了共享的 url,并进行了相应的更改。下面是我所做的更改: eventDict = json.dumps(event) event = json.loads(eventDict) 我正在再次使用该事件,这样我就可以将它用作字典来获取我需要创建的值XML。同样,在 AWS lambda 中生成的 XML 很好,并且相同的内容被上传到 S3 存储桶,但是当我通过 API Gateway 进行测试时,它会导致相同的错误:“errorType”:“KeyError”,“stackTrace”:[“File \ "/var/task/sample.py\",第 26 行,在 printMessage\n b1.text = event['header']['echoToken']
  • 我在 AWS Gateway 的请求正文部分传递我的 JSON。
  • 答案让我朝着正确的方向前进。标记为正确。谢谢
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多