本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用状态机处理 Step Functions 函数错误情形
在本教程中,您将创建带有 回退状态 字段的 Amazon Step Functions 状态机。Catch
字段使用 Amazon Lambda 函数来响应基于错误消息类型的条件逻辑。这是一种称为函数错误处理 的技术。
有关更多信息,请参阅《Amazon Lambda 开发人员指南》中的 Node.js 中的 Amazon Lambda 函数错误。
注意
您还可以创建在超时情况下执行重试的状态机,或者创建使用 Catch
在出错或超时情况下转换为特定状态的状态机。有关这些错误处理技术的示例,请参阅使用 Retry 和使用 Catch 示例。
第 1 步:创建一个失败的 Lambda 函数
使用 Lambda 函数来模拟错误情形。
重要
确保您的 Lambda 函数与状态机位于相同的 Amazon 账户和 Amazon Web Services 区域下。
-
通过 https://console.aws.amazon.com/lambda/
打开 Amazon 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 控制台创建使用 Task 工作流程状态 状态和 Catch
字段的状态机。在 Task 状态中添加对您 Lambda 函数的引用。状态机调用 Lambda 函数,该函数将在执行过程中失败。Step Functions 重试函数两次,在两次重试之间使用指数回退。
-
打开 Step Functions 控制台
,然后选择创建状态机。 -
在 选择模板对话框中,选择空白。
-
选择选择,以便在设计模式下打开工作流程工作室。
-
选择代码,打开代码编辑器。在代码编辑器中,您可以编写和编辑工作流的 Amazon States Language (ASL) 定义。
-
粘贴以下代码,但要替换之前在
Resource
字段中创建的 Lambda 函数的 ARN。{ "Comment": "A Catch example of the Amazon States Language using an Amazon 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
。这些错误包括内存不足错误和函数超时。您可以匹配Lambda.Unknown
、States.ALL
或States.TaskFailed
来处理这些错误。当 Lambda 达到最大调用次数时,会出现Lambda.TooManyRequestsException
错误。有关 LambdaHandled
和Unhandled
错误的更多信息,请参阅 Amazon Lambda 开发人员指南中的FunctionError
。 -
(可选)在图形可视化中,查看工作流的实时图形可视化。
-
为状态机指定一个名称。要执行此操作,请选择默认状态机名称 MyStateMachine 旁边的编辑图标。然后,找到状态机配置,在状态机名称框中指定一个名称。
在本教程中,请输入
Catchfailure
。 -
(可选)在状态机配置中,指定其他工作流设置,例如状态机类型及其执行角色。
在本教程中,请保留状态机设置中的所有默认选项。
-
在确认角色创建对话框中,选择确认继续。
您也可以选择查看角色设置,返回至状态机配置。
注意
如果您删除了 Step Functions 创建的 IAM 角色,Step Functions 在以后无法重新创建该角色。同样,如果您修改了该角色(例如,通过在 IAM 策略中从主体中删除 Step Functions),Step Functions 在以后也无法还原其原始设置。
第 4 步:运行状态机
在创建状态机后,便可以运行它。
-
在状态机页面上,选择 Catchfailure。
-
在 Catchfailure 页面上,选择启动执行。随即显示启动执行对话框。
-
在启动执行对话框中,执行以下操作:
-
(可选)输入自定义执行名称,以便覆盖生成的默认执行名称。
非 ASCII 名称和日志记录
Step Functions 对于状态机、执行、活动和标签接受包含非 ASCII 字符的名称。由于此类字符不适用于 Amazon CloudWatch,因此我们建议您仅使用 ASCII 字符,这样您就可以在 CloudWatch 中跟踪指标。
-
(可选)在输入框中,以 JSON 格式输入输入值以便运行工作流。
-
选择启动执行。
-
Step Functions 控制台会将您引导到一个以您的执行 ID 为标题的页面。该页面被称为执行详细信息页面。在此页面上,您可以随着执行的进展或者在执行完成后查看执行结果。
要查看执行结果,请在图表视图上选择各个状态,然后在步骤详细信息窗格中选择各个选项卡,分别查看每个状态的详细信息,包括输入、输出和定义。有关可在执行详细信息页面上查看的执行信息的详细信息,请参阅执行详细信息概览。
例如,要查看您自定义的错误消息,请在图表视图中选择 CreateAccount 步骤,然后选择 输出选项卡。
注意
可以通过使用
ResultPath
来保留状态输入以及错误。请参阅 ResultPath 用于在 a 中同时包含错误和输入 Catch。 -