本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用状态机处理 Step Functions 函数错误情形
在本教程中,您将创建一个 AWS Step Functions 带回退状态字段的状态机。该Catch
字段使用 AWS Lambda 函数,使用基于错误消息类型的条件逻辑进行响应。这是一种称为函数错误处理 的技术。
有关更多信息,请参阅 AWS Lambda Node.js 中的函数错误 AWS Lambda 开发者指南。
注意
您还可以创建在超时情况下执行重试的状态机,或者创建使用 Catch
在出错或超时情况下转换为特定状态的状态机。有关这些错误处理技术的示例,请参阅使用 Retry 和使用 Catch 示例。
第 1 步:创建一个失败的 Lambda 函数
使用 Lambda 函数来模拟错误情形。
重要
确保您的 Lambda 函数处于相同状态 AWS 账户和 AWS 区域 作为你的状态机。
-
打开 AWS Lambda 控制台位于https://console.aws.amazon.com/lambda/
。 -
选择 Create function (创建函数)。
-
选择使用蓝图,在搜索框中输入
step-functions
,然后选择抛出自定义错误蓝图。 -
对于函数名称,请输入
FailFunction
。 -
对于角色,保留默认选择(使用基本 Lambda 权限创建新角色)。
-
以下代码显示在 Lambda 函数代码窗格中。
exports.handler = async (event, context) => { function CustomError(message) { this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error(); throw new CustomError('This is a custom error!'); };
context
对象返回错误消息This is a custom error!
。 -
选择 Create function (创建函数)。
-
创建 Lambda 函数后,复制页面右上角显示的函数的 Amazon 资源名称 (ARN)。以下是一个示例ARN:
arn:aws:lambda:us-east-1:123456789012:function:FailFunction
-
选择部署。
第 2 步:测试 Lambda 函数
测试您的 Lambda 函数以查看其运行情况。
-
在FailFunction页面上,选择 “测试” 选项卡,然后选择 “测试”。您无需创建测试事件。
-
在执行结果下,展开详细信息以查看测试结果(模拟的错误)。
第 3 步:创建使用 Catch 字段的状态机
通过 Step Functions 控制台创建使用 任务工作流状态 状态和 Catch
字段的状态机。在 Task 状态中添加对您 Lambda 函数的引用。状态机调用 Lambda 函数,该函数将在执行过程中失败。Step Functions 重试函数两次,在两次重试之间使用指数回退。
-
打开 Step Functions 控制台
,然后选择创建状态机。 -
在 选择模板对话框中,选择空白。
-
选择 “选择” 以在中打开 “工作流工作室” 设计模式。
-
选择代码,打开代码编辑器。在代码编辑器中,您可以编写和编辑工作流程的 Amazon States Language (ASL) 定义。
-
粘贴以下代码,但要替换您之前在该字段中创建的 Lambda 函数的
Resource
代码。ARN{ "Comment": "A Catch example of the Amazon States Language using an AWS Lambda function", "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "
arn:aws:lambda:us-east-1:123456789012:function:FailFunction
", "Catch": [ { "ErrorEquals": ["CustomError"], "Next": "CustomErrorFallback" }, { "ErrorEquals": ["States.TaskFailed"], "Next": "ReservedTypeFallback" }, { "ErrorEquals": ["States.ALL"], "Next": "CatchAllFallback" } ], "End": true }, "CustomErrorFallback": { "Type": "Pass", "Result": "This is a fallback from a custom Lambda function exception", "End": true }, "ReservedTypeFallback": { "Type": "Pass", "Result": "This is a fallback from a reserved error code", "End": true }, "CatchAllFallback": { "Type": "Pass", "Result": "This is a fallback from any error code", "End": true } } }这是使用 Amazon States Language 的状态机的说明。它定义了名为
CreateAccount
的单个Task
状态。有关更多信息,请参阅状态机结构。有关
Retry
字段的语法的更多信息,请参阅使用 Retry 和使用 Catch 的状态机示例。注意
Lambda 中未处理的错误在错误输出中报告为
Lambda.Unknown
。其中包括 out-of-memory 错误和函数超时。您可以匹配Lambda.Unknown
、States.ALL
或States.TaskFailed
来处理这些错误。当 Lambda 达到最大调用次数时,会出现Lambda.TooManyRequestsException
错误。有关 LambdaHandled
和Unhandled
错误的更多信息,请参阅中的FunctionError
AWS Lambda 开发者指南。 -
(可选)在图形可视化中,查看工作流的实时图形可视化。
-
为状态机指定一个名称。为此,请选择默认状态机名称旁边的编辑图标MyStateMachine。然后,找到状态机配置,在状态机名称框中指定一个名称。
在本教程中,请输入
Catchfailure
。 -
(可选)在状态机配置中,指定其他工作流设置,例如状态机类型及其执行角色。
在本教程中,请保留状态机设置中的所有默认选项。
-
在确认角色创建对话框中,选择确认继续。
您也可以选择查看角色设置,返回至状态机配置。
注意
如果你删除 Step Functions 创建的IAM角色,Step Functions 以后将无法重新创建它。同样,如果您修改角色(例如,通过从IAM策略的主体中删除 Step Functions),Step Functions 以后将无法恢复其原始设置。
第 4 步:运行状态机
在创建状态机后,便可以运行它。
-
在状态机页面上,选择 Catchfailure。
-
在 Catchfailure 页面上,选择启动执行。随即显示启动执行对话框。
-
在启动执行对话框中,执行以下操作:
-
(可选)输入自定义执行名称以覆盖生成的默认值。
非ASCII姓名和日志
Step Functions 接受状态机、执行、活动和包含非ASCII字符的标签的名称。由于此类字符不适用于亚马逊 CloudWatch,因此我们建议您仅使用ASCII字符,以便您可以跟踪中的指标 CloudWatch。
-
(可选)在 “输入” 框中,按JSON格式输入输入值以运行您的工作流程。
-
选择启动执行。
-
Step Functions 控制台会将您引导到一个以您的执行 ID 为标题的页面。该页面被称为执行详细信息页面。在此页面上,您可以随着执行的进展或者在执行完成后查看执行结果。
要查看执行结果,请在图表视图上选择各个状态,然后在步骤详细信息窗格中选择各个选项卡,分别查看每个状态的详细信息,包括输入、输出和定义。有关可在执行详细信息页面上查看的执行信息的详细信息,请参阅执行详情概述。
例如,要查看您的自定义错误消息,请在图表视图中选择CreateAccount步骤,然后选择输出选项卡。
注意
可以通过使用
ResultPath
来保留状态输入以及错误。请参阅 ResultPath 用于在 a 中同时包含错误和输入 Catch。 -