使用 Step Functions 状态机处理错误情形 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Step Functions 状态机处理错误情形

在本教程中,您将创建带有 Catch 字段的 Amazon Step Functions 状态机。这些区域有:Catch字段使用Amazon Lambda函数来响应基于错误消息类型的条件逻辑。这是一种称为函数错误处理 的技术。

有关更多信息,请参阅 。函数错误处理中的Amazon Lambda开发人员指南.

注意

您还可以创建在超时情况下执行 Retry 的状态机,或者创建使用 Catch 在出错或超时情况下转换为特定状态的状态机。有关这些错误处理技术的示例,请参阅使用 Retry 和使用 Catch 示例

第 1 步:创建失败的 Lambda 函数

使用 Lambda 函数来模拟错误情形。

重要

确保您的 Lambda 函数处于相同之下Amazon账户和Amazon作为状态机的区域。

  1. 打开 Amazon Lambda 控制台,地址:https://console.aws.amazon.com/lambda/

    选择创建函数

  2. 选择使用蓝图输入,step-functions进入过滤器,然后选择Step Functions 错误蓝图。

  3. 选择 Configure(配置)。

  4. 基本信息部分中,配置 Lambda 函数:

    1. 对于 Name (名称),请输入 FailFunction

    2. 对于 Role (角色),选择 Create a new role with basic Lambda permissions (创建具有基本 Lambda 权限的新角色)

  5. 以下代码显示在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!

  6. 选择 Create function(创建函数)。

    创建 Lambda 函数后,复制页面右上角显示的函数的亚马逊资源名称 (ARN)。要复制 ARN,请单击 
                                copy Amazon Resource Name
                            . 以下是示例 ARN:

    arn:aws:lambda:us-east-1:123456789012:function:FailFunction
  7. 选择 Deploy(部署)。

第 2 步:测试 Lambda 函数

测试 Lambda 函数以查看其运行情况。

  1. FailFunction 页面上,选择 Test

  2. 配置测试事件对话框中,输入FailFunction为了Event name (事件名称),然后选择Create.

  3. 在存储库的FailFunction页面上,选择测试测试 Lambda 函数。

    测试结果(模拟错误)显示在新选项卡中执行结果.

第 3 步:创建使用 Catch 字段的状态机

使用Step Contions 控制台创建使用的状态机Task状态与Catch字段中返回的子位置类型。在中添加对 Lambda 函数的引用Task状态。这会调用 Lambda 函数并在执行期间失败。Step Functions 重试函数两次,在两次重试之间使用指数回退。

  1. 打开Step Contions 控制台然后选择创建状态机.

  2. 在存储库的选择创作方法页面上,选择用代码编写你的工作流.

  3. 适用于类型,保留默认选择,也就是说,标准.

  4. 定义窗格中,粘贴以下代码,但替换的 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.UnknownStates.ALL,或者States.TaskFailed来处理这些错误。当 Lambda 达到最大调用次数时,错误是Lambda.TooManyRequestsException. 有关 Lambda 函数错误的更多信息,请参阅重试错误处理和自动重试中的Amazon Lambda开发人员指南.

  5. 使用中的图表可视工作流” 窗格可检查您的亚马逊状态语言代码是否正确描述了状态机。

    如果您未看到该图表,请在 
       refresh
    Visual Workflow 窗格中选择“”。

  6. 选择 Next(下一步)。

  7. 输入名称对于状态机,例如Catchfailure.

  8. InPermissions (权限),选择创建新角色.

  9. 选择 Create state machine (创建状态机)

第 4 步:启动新的执行

在创建您的状态机后,可以开始执行。

  1. 在存储库的捕获失败页面上,选择开始执行.

    这些区域有:开始执行此时会显示对话框。

  2. (可选)要识别您的执行,您可以在名称。默认情况下,Step Functions 会自动生成唯一的执行名称。

    注意

    Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为了确保你可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。

  3. 选择 Start Execution (开始执行)

    此时将启动新的状态机执行,并显示一个说明正在运行的执行的新页面。

  4. 转至执行输出选项卡可查看工作流程的输出。

    
                            执行输出
  5. 要查看您的自定义错误消息,请选择CreateAccount中的Graph Inspector窗格然后选择步骤输出选项卡。

    
                            错误输出
    注意

    可以通过使用 ResultPath 来保留状态输入以及错误。请参阅 ResultPath 用于在 a 中同时包含错误和输入Catch