本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Step Functions 状态机处理错误情形
在本教程中,您将创建带有 Catch
字段的 Amazon Step Functions 状态机。这些区域有:Catch
字段使用Amazon Lambda函数来响应基于错误消息类型的条件逻辑。这是一种称为函数错误处理 的技术。
有关更多信息,请参阅 。函数错误处理中的Amazon Lambda开发人员指南.
您还可以创建在超时情况下执行 Retry
的状态机,或者创建使用 Catch
在出错或超时情况下转换为特定状态的状态机。有关这些错误处理技术的示例,请参阅使用 Retry 和使用 Catch 示例。
第 1 步:创建失败的 Lambda 函数
使用 Lambda 函数来模拟错误情形。
确保您的 Lambda 函数处于相同之下Amazon账户和Amazon作为状态机的区域。
-
打开 Amazon Lambda 控制台,地址:https://console.aws.amazon.com/lambda/
。 选择创建函数。
-
选择使用蓝图输入,
step-functions
进入过滤器,然后选择Step Functions 错误蓝图。 -
选择 Configure(配置)。
-
在基本信息部分中,配置 Lambda 函数:
-
对于 Name (名称),请输入
FailFunction
。 -
对于 Role (角色),选择 Create a new role with basic Lambda permissions (创建具有基本 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 函数后,复制页面右上角显示的函数的亚马逊资源名称 (ARN)。要复制 ARN,请单击
. 以下是示例 ARN:
arn:aws:lambda:us-east-1:123456789012:function:FailFunction
-
选择 Deploy(部署)。
第 2 步:测试 Lambda 函数
测试 Lambda 函数以查看其运行情况。
-
在
FailFunction
页面上,选择 Test。 -
在配置测试事件对话框中,输入
FailFunction
为了Event name (事件名称),然后选择Create. -
在存储库的
FailFunction
页面上,选择测试测试 Lambda 函数。测试结果(模拟错误)显示在新选项卡中执行结果.
第 3 步:创建使用 Catch 字段的状态机
使用Step Contions 控制台Task
状态与Catch
字段中返回的子位置类型。在中添加对 Lambda 函数的引用Task
状态。这会调用 Lambda 函数并在执行期间失败。Step Functions 重试函数两次,在两次重试之间使用指数回退。
-
打开Step Contions 控制台
然后选择创建状态机. -
在存储库的选择创作方法页面上,选择用代码编写你的工作流.
-
适用于类型,保留默认选择,也就是说,标准.
-
在定义窗格中,粘贴以下代码,但替换的 ARN您之前创建的 Lambda 函数中的
Resource
字段中返回的子位置类型。{ "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 } } }这是使用亚马逊状态机的说明。它定义了名为
CreateAccount
的单个Task
状态。有关更多信息,请参阅状态机结构。有关
Retry
字段的语法的更多信息,请参阅使用重试和使用 Catch 的示例。注意 Lambda 中未处理的错误被报告为
Lambda.Unknown
在错误输出中。包括 out-of-memory 错误和函数超时。你可以在Lambda.Unknown
、States.ALL
,或者States.TaskFailed
来处理这些错误。当 Lambda 达到最大调用次数时,错误是Lambda.TooManyRequestsException
. 有关 Lambda 函数错误的更多信息,请参阅重试错误处理和自动重试中的Amazon Lambda开发人员指南. -
使用中的图表可视工作流” 窗格可检查您的亚马逊状态语言代码是否正确描述了状态机。
如果您未看到该图表,请在
Visual Workflow 窗格中选择“”。
-
选择 Next(下一步)。
-
输入名称对于状态机,例如
.Catchfailure
-
InPermissions (权限),选择创建新角色.
-
选择 Create state machine (创建状态机)。
第 4 步:启动新的执行
在创建您的状态机后,可以开始执行。
-
在存储库的
捕获失败
页面上,选择开始执行.这些区域有:开始执行此时会显示对话框。
(可选)要识别您的执行,您可以在名称。默认情况下,Step Functions 会自动生成唯一的执行名称。
注意 Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为了确保你可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
选择 Start Execution (开始执行)。
此时将启动新的状态机执行,并显示一个说明正在运行的执行的新页面。
-
转至执行输出选项卡可查看工作流程的输出。
-
要查看您的自定义错误消息,请选择
CreateAccount
中的Graph Inspector窗格然后选择步骤输出选项卡。注意 可以通过使用
ResultPath
来保留状态输入以及错误。请参阅 ResultPath 用于在 a 中同时包含错误和输入Catch。