在 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. 对于 Role (角色),选择 Create a new role with basic Lambda permissions (创建具有基本 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. 选择 Test 以使用测试事件调用您的函数。

  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: Invoke 任务状态。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 示例