首页 > 解决方案 > AWS Lambda 中的中间件与 Python

问题描述

我有一个我们正在使用 Electron Framework 开发的桌面应用程序。它使用别名 ARN 直接调用 AWS Lambda 函数。Lambda 函数正在 python 3.6 中开发。没有 API 网关处理请求,因为它们只是通过对 Lambda 的直接调用来管理。Lambda 处理此类请求的方式由 AWS 文档指定:

当您调用 Lambda 函数时,Lambda 会接收调用请求并验证您的执行角色的权限,验证事件文档是否为有效的 JSON 文档,并检查参数值。

当 Lambda 验证事件文档时会出现问题,因为当它无效时,它会使用自己的格式自动发送错误消息。AWS 文档将其解释为:

如果请求通过验证,Lambda 会将请求发送到函数实例。Lambda 运行时环境将事件文档转换为对象,并将其传递给您的函数处理程序。

我的问题是:如何在 Lambda 运行时环境为我完成之前控制事件文档并自己解析它?如果收到无效的 JSON 事件,我需要指定我自己的格式化错误消息。此外,我不需要在电子 JavaScript 应用程序中获取 python 堆栈跟踪。以下是解析事件文档失败时的错误消息示例。此实例中的无效 JSON 事件有一个额外的逗号:

{"errorMessage": "Expecting property name enclosed in double quotes: line 3 column 1 (char 54)", "errorType": "JSONDecodeError", "stackTrace": [["/var/lang/lib/python3.6/json/__init__.py", 354, "loads", "return _default_decoder.decode(s)"], ["/var/lang/lib/python3.6/json/decoder.py", 339, "decode", "obj, end = self.raw_decode(s, idx=_w(s, 0).end())"], ["/var/lang/lib/python3.6/json/decoder.py", 355, "raw_decode", "obj, end = self.scan_once(s, idx)"]]}

我尝试使用可以在 lambda 调用发生之前引入某种中间件的 python 装饰器来克服这个问题,但似乎没有任何效果。我尝试的装饰器是由aws-powertoolslambda-decoratorsaws-lambda-decorators开发的。我认为还有一个中间件引擎可以帮助解决这个问题:middy,但它只能用于 Node.js Lambda 函数。我什至认真地将整个 Lambda python 文件放在 try-except 语句中,但它似乎也不起作用。我搜索了其他一些解决方案,但其中大多数解决了 API Gateway 中的问题,例如Chalice Framework 中的问题,而不是 Lambda 本身中的问题。

如果您能提出一个解决方案,该解决方案可以用作中间件,在 Lambda 运行时环境将事件文档解析为对象之前获取事件文档,我将非常高兴。

提前致谢..

标签: pythonerror-handlingaws-lambdamiddleware

解决方案


推荐阅读