在 Step Functions 状态机中处理错误条件
在本教程中,您将创建一个具有 Task 状态的 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
-
选择测试以使用测试事件调用函数。
-
展开执行函数以查看所引发错误的详细信息。
现在,您已准备好一个 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 函数。
-
切换回设计模式并选择名为 CreateAccount 的 Lambda: 调用任务状态。
在配置选项卡上,查找 API 参数。对于函数名称,选择之前创建的 Lambda 函数。
选择创建,查看角色,然后选择确认以创建您的状态机。
第 5 步:运行状态机
创建并配置状态机之后,可以运行该状态机并检查流程。
-
在编辑器中,选择执行。
或者,从状态机列表中选择启动执行。
-
在启动执行对话框中,接受生成的 ID,然后在输入中输入以下 JSON:
{ "Cause" : "Custom Function Error" } -
选择启动执行。
Step Functions 控制台会将您引导到一个以您的执行 ID 为标题的页面,即执行详细信息页面。您可以随着工作流的进展以及在工作流完成后查看执行结果。
要查看执行结果,请在图表视图上选择各个状态,然后在步骤详细信息窗格中选择各个选项卡,分别查看每个状态的详细信息,包括输入、输出和定义。有关可在执行详细信息页面上查看的执行信息的详细信息,请参阅执行详细信息概览。
状态机将调用 Lambda 函数,从而引发 CustomError。在图表视图中选择 CreateAccount 步骤以查看状态输出。您的状态机输出应类似于下图:
恭喜您!
您现在拥有可以捕获和处理 Lambda 函数引发的错误条件的状态机。您可以使用这种模式在工作流中实施强大的错误处理。
注意
您还可以创建在超时情况下执行重试的状态机,或者创建使用 Catch 在出错或超时情况下转换为特定状态的状态机。有关这些错误处理技术的示例,请参阅使用 Retry 和使用 Catch 示例。