本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Step Functions 状态机中处理错误情况
在本教程中,您将创建一个具有任务 Amazon Step Functions 状态的状态机,该状态机调用为抛出自定义错误而构建的示例 Lambda 函数。
任务是其中之一回退状态,您可以为其配置字Catch段。当集成收到错误时,catch 字段会根据错误名称选择后续步骤。
步骤 1:创建会引发错误的 Lambda 函数
使用 Lambda 函数来模拟错误情形。
- 
                    打开 Amazon Lambda 控制台,网址为https://console.aws.amazon.com/lambda/ 。 
- 
                    选择创建函数。 
- 
                    选择使用蓝图 Step Functions,搜索并选择抛出自定义错误。
- 
                    对于函数名称,请输入 ThrowErrorFunction。
- 
                    对于 Role (角色),选择 Create a new role with basic Lambda permissions (创建具有基本 Lambda 权限的新角色)。 
- 
                    选择创建函数。 以下代码应显示在代码窗格中。 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
- 
                    选择测试选项卡。 
- 
                     选择创建新事件并保留默认的事件 JSON 
- 
                     选择 Test 以使用测试事件调用您的函数。 
- 
                    展开 “执行函数” 以查看抛出的错误的详细信息。 
现在,您已准备好抛出自定义错误的 Lambda 函数。
在下一步中,您将设置一个状态机来捕获并重试该错误。
第 3 步:创建您的状态机
使用 Step Functions 控制台创建使用Task 工作流程状态带有Catch配置的状态机。状态机将调用 Lambda 函数,您构建该函数是为了模拟在调用该函数时抛出错误。Step Functions 在两次重试之间使用指数退避来重试该函数。
- 
                    打开 Step Functions 控制台 ,从菜单中选择状态机,然后选择创建状态机。 
- 
                    选择 “从空白处创建”,然后在 “状态机名称” 中输入 CatchErrorStateMachine。
- 
                  接受默认类型(标准),然后选择 “继续”,在 Workflow Studio 中编辑状态机。 
- 
                  选择 “代码” 以切换到 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 函数。
- 
                切换回设计模式并选择名为 Lambda: Invoke 任务状态。CreateAccount 
- 在 “配置” 选项卡上,查找 API 参数。对于函数名称,请选择您之前创建的 Lambda 函数。 
- 选择创建,查看角色,然后选择确认以创建您的状态机。 
第 5 步:运行状态机
创建和配置状态机后,您可以运行状态机并检查流程。
- 
                    在编辑器中,选择 “执行”。 或者,从 “状态机” 列表中选择 “开始执行”。 
- 
                在 “开始执行” 对话框中,接受生成的 ID,然后在 “输入” 中输入以下 JSON: { "Cause" : "Custom Function Error" }
- 
                选择启动执行。 
Step Functions 控制台将您引导至标有您的执行 ID 的页面,即执行详情页面。您可以随着工作流程的进展和完成后查看执行结果。
要查看执行结果,请在图表视图上选择各个状态,然后在步骤详细信息窗格中选择各个选项卡,分别查看每个状态的详细信息,包括输入、输出和定义。有关可在执行详细信息页面上查看的执行信息的详细信息,请参阅执行详细信息概览。
您的状态机调用 Lambda 函数,该函数会抛出。CustomError在图表视图中选择CreateAccount步骤以查看状态输出。您的状态机输出应与下图类似:
 
                         
                         
                    恭喜您!
你现在有了可以捕捉和处理 Lambda 函数引发的错误条件的状态机。您可以使用这种模式在工作流程中实现强大的错误处理。
注意
您还可以创建在超时情况下执行重试的状态机,或者创建使用 Catch 在出错或超时情况下转换为特定状态的状态机。有关这些错误处理技术的示例,请参阅使用 Retry 和使用 Catch 示例。