使用 Python Lambda 处理 AWS Step Function 中的意外错误的最佳做法是什么?
What is the best practice for handling unexpected errors in an AWS Step Function using Python Lambdas?
Step Functions 是控制 lambda(或其他事件)流的 AWS 结构。我所有的 lambda 都使用 Python(但 Lambda 可以使用大多数主要语言)。在整个过程中,我的步骤函数将状态更新发送回客户端(客户端通过 API 触发它)。假设它通过这些更新取得进展:开始 -> 进行中 -> 完成 -> 完成。对于已处理的错误,它会将 'Error' 状态发送回客户端。所以客户端可以看到这样的时间线:开始 -> 进行中 -> 错误。这是理想的——这样用户就知道进程已经停止。
但是当存在 unexpected/unhandled 错误时,客户端永远不会真正知道,并且时间线可能会无限期地停留在 'In Progress' - 用户不知道发生了什么。所以我开始研究 built-in Step Function error handling。我喜欢这个选项,因为我可以为每个 lambda 或事件创建一个 'Catch' 函数,如果出现错误,我可以在其中与客户端通信。这样做的缺点是它确实使步进函数 template/design 变得混乱,请参见下面的 before/after 屏幕截图。
之前----------------
之后----------------
生成这些图表的模板代码看起来也好不到哪儿去。所以我考虑了一个看起来同样混乱的替代方案。我可以在每个 lambda 中为整个 lambda 添加一个 try/except 块 - 以捕获 any/all 错误。例如:
def lambda_handler(event, context):
try:
#Execute function tasks
except:
#Communicate back to client that there was an error
类似于步进函数 'Catch' 函数,这将确保我捕获并传达任何错误。但这似乎是一个坏主意,因为它是什么(添加 blanket/blind try/except)。
所以现在我被困在 messy/repeated 代码和 try/except 之间。我是否错误地实现了阶跃函数 'Catch'?我是否缺少处理未知 Python 错误的更好方法?完全有另一种方法吗?
我不明白为什么为整个 lambda 使用 try-catch 系统是个坏主意。它只是确保您始终可以控制如何将错误传达给 lambda 函数的调用者。
例如,假设一个 lambda 用作 HTTP 的后端 API,最好对所有内容都进行 try-catch,这样您就可以与客户沟通问题所在是,或者至少提供一个通用的 HTTP 500 类型错误。在这种情况下,这些函数将由 AWS Step Functions 调用,这意味着您的错误消息不必对用户友好,但您可能希望控制意外异常的处理方式这一事实仍然是在我的书中也是如此。
正如@stijndepestel 指出的那样,进行全面的错误检查是个好主意。
我在 Python Lambda 函数中所做的是:我有一个自定义路由器 class,除了路由管理外,它还处理所有错误。如果错误继承自我创建的基本错误 class,那么这是我抛出的自定义错误,并且在我创建它们时为它们分配了特殊信息,这些信息在转换为字符串时会自动格式化。如果可能,路由器将其发送回客户端。
但如果错误是某个 unknown/unexpected 错误,路由器会将其尽可能详细地打印到 CloudWatch Logs,然后 returns 将通用的“500 内部服务器错误”消息打印到客户。
我将来可能会设置它,以便在发生此类错误时通过电子邮件或类似方式通知我,以便我可以迅速采取行动。
Step Functions 是控制 lambda(或其他事件)流的 AWS 结构。我所有的 lambda 都使用 Python(但 Lambda 可以使用大多数主要语言)。在整个过程中,我的步骤函数将状态更新发送回客户端(客户端通过 API 触发它)。假设它通过这些更新取得进展:开始 -> 进行中 -> 完成 -> 完成。对于已处理的错误,它会将 'Error' 状态发送回客户端。所以客户端可以看到这样的时间线:开始 -> 进行中 -> 错误。这是理想的——这样用户就知道进程已经停止。
但是当存在 unexpected/unhandled 错误时,客户端永远不会真正知道,并且时间线可能会无限期地停留在 'In Progress' - 用户不知道发生了什么。所以我开始研究 built-in Step Function error handling。我喜欢这个选项,因为我可以为每个 lambda 或事件创建一个 'Catch' 函数,如果出现错误,我可以在其中与客户端通信。这样做的缺点是它确实使步进函数 template/design 变得混乱,请参见下面的 before/after 屏幕截图。
之前----------------
之后----------------
生成这些图表的模板代码看起来也好不到哪儿去。所以我考虑了一个看起来同样混乱的替代方案。我可以在每个 lambda 中为整个 lambda 添加一个 try/except 块 - 以捕获 any/all 错误。例如:
def lambda_handler(event, context):
try:
#Execute function tasks
except:
#Communicate back to client that there was an error
类似于步进函数 'Catch' 函数,这将确保我捕获并传达任何错误。但这似乎是一个坏主意,因为它是什么(添加 blanket/blind try/except)。
所以现在我被困在 messy/repeated 代码和 try/except 之间。我是否错误地实现了阶跃函数 'Catch'?我是否缺少处理未知 Python 错误的更好方法?完全有另一种方法吗?
我不明白为什么为整个 lambda 使用 try-catch 系统是个坏主意。它只是确保您始终可以控制如何将错误传达给 lambda 函数的调用者。
例如,假设一个 lambda 用作 HTTP 的后端 API,最好对所有内容都进行 try-catch,这样您就可以与客户沟通问题所在是,或者至少提供一个通用的 HTTP 500 类型错误。在这种情况下,这些函数将由 AWS Step Functions 调用,这意味着您的错误消息不必对用户友好,但您可能希望控制意外异常的处理方式这一事实仍然是在我的书中也是如此。
正如@stijndepestel 指出的那样,进行全面的错误检查是个好主意。
我在 Python Lambda 函数中所做的是:我有一个自定义路由器 class,除了路由管理外,它还处理所有错误。如果错误继承自我创建的基本错误 class,那么这是我抛出的自定义错误,并且在我创建它们时为它们分配了特殊信息,这些信息在转换为字符串时会自动格式化。如果可能,路由器将其发送回客户端。
但如果错误是某个 unknown/unexpected 错误,路由器会将其尽可能详细地打印到 CloudWatch Logs,然后 returns 将通用的“500 内部服务器错误”消息打印到客户。
我将来可能会设置它,以便在发生此类错误时通过电子邮件或类似方式通知我,以便我可以迅速采取行动。