在 Step Functions 状态机中处理错误条件 - AWS Step Functions

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Step Functions 状态机中处理错误条件

在本教程中,您将创建一个具有任务 AWS Step Functions 状态的状态机,该状态机调用为抛出自定义错误而构建的示例 Lambda 函数。

任务属于 回退状态,您可以为其配置 Catch 字段。当集成收到错误时,Catch 字段会根据错误名称选择后续步骤。

第 1 步:创建一个会引发错误的 Lambda 函数

使用 Lambda 函数来模拟错误情形。

  1. 打开 AWS Lambda 控制台,网址为https://console.aws.amazon.com/lambda/

  2. 选择创建函数

  3. 选择使用蓝图,搜索 Step Functions 并选择引发自定义错误

  4. 对于函数名称,请输入 ThrowErrorFunction

  5. 对于角色,选择创建具有基本 Lambda 权限的新角色

  6. 选择创建函数

    以下代码应显示在代码窗格中。

    export const handler = async () => { function CustomError(message) { this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error(); throw new CustomError('This is a custom error!'); };

第 2 步:测试您的 Lambda 函数

创建状态机之前,请验证您的 Lambda 函数在调用时是否会引发 CustomError

  1. 选择测试选项卡。

  2. 选择创建新事件并保留默认的事件 JSON

  3. 选择测试以使用测试事件调用函数。

  4. 展开执行函数以查看所引发错误的详细信息。

现在,您已准备好一个 Lambda 函数,可用来引发自定义错误。

在下一步中,您将设置一个状态机来捕获该错误并进行重试操作。

第 3 步:创建状态机

通过 Step Functions 控制台创建使用 Task 工作流程状态(具有 Catch 配置)的状态机。状态机将调用 Lambda 函数,您构建该函数是为了模拟在调用该函数时引发错误。Step Functions 重试该函数,在两次重试之间使用指数回退。

  1. 打开 Step Functions 控制台,从菜单中选择状态机,然后选择创建状态机

  2. 选择 “从空白处创建”,然后在 “状态机名称” 中输入CatchErrorStateMachine

  3. 接受默认类型(标准),然后选择继续,以在 Workflow Studio 中编辑状态机。

  4. 选择代码以切换到 ASL 编辑器,然后将代码替换为以下状态机定义:

    { "Comment": "Example state machine that can catch a custom error thrown by a function integration.", "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Output": "{% $states.result.Payload %}", "Arguments": { "FunctionName": "arn:aws:lambda:region:account-id:function:ThrowErrorFunction:$LATEST", "Payload": "{% $states.input %}" }, "Catch": [ { "ErrorEquals": [ "CustomError" ], "Next": "CustomErrorFallback" }, { "ErrorEquals": [ "States.ALL" ], "Next": "CatchAllFallback" } ], "End": true, "Retry": [ { "ErrorEquals": [ "CustomError", "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 1, "MaxAttempts": 3, "BackoffRate": 2, "JitterStrategy": "FULL" } ] }, "CustomErrorFallback": { "Type": "Pass", "End": true, "Output": { "Result": "Fallback from a custom error function." } }, "CatchAllFallback": { "Type": "Pass", "End": true, "Output": { "Result": "Fallback from all other error codes." } } }, "QueryLanguage": "JSONata" }

第 4 步:配置状态机

运行状态机之前,必须先连接到之前创建的 Lambda 函数。

  1. 切换回设计模式并选择名为的 Lambda: 调用任务状态。CreateAccount

  2. 配置选项卡上,查找 API 参数。对于函数名称,选择之前创建的 Lambda 函数。

  3. 选择创建,查看角色,然后选择确认以创建您的状态机。

第 5 步:运行状态机

创建并配置状态机之后,可以运行该状态机并检查流程。

  1. 在编辑器中,选择执行

    或者,从状态机列表中选择启动执行

  2. 启动执行对话框中,接受生成的 ID,然后在输入中输入以下 JSON:

    { "Cause" : "Custom Function Error" }
  3. 选择启动执行

Step Functions 控制台会将您引导到一个以您的执行 ID 为标题的页面,即执行详细信息页面。您可以随着工作流的进展以及在工作流完成后查看执行结果。

要查看执行结果,请在图表视图上选择各个状态,然后在步骤详细信息窗格中选择各个选项卡,分别查看每个状态的详细信息,包括输入、输出和定义。有关可在执行详细信息页面上查看的执行信息的详细信息,请参阅执行详细信息概览

状态机将调用 Lambda 函数,从而引发 CustomError。在图表视图中选择CreateAccount步骤以查看状态输出。您的状态机输出应类似于下图:

捕获自定义错误的工作流的说明性屏幕截图。

恭喜您!

您现在拥有可以捕获和处理 Lambda 函数引发的错误条件的状态机。您可以使用这种模式在工作流中实施强大的错误处理。

注意

您还可以创建在超时情况下执行重试的状态机,或者创建使用 Catch 在出错或超时情况下转换为特定状态的状态机。有关这些错误处理技术的示例,请参阅使用 Retry 和使用 Catch 示例