使用状态机处理 Step Functions 函数错误情形 - AWS Step Functions

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

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

在本教程中,您将创建一个 AWS Step Functions 带回退状态字段的状态机。该Catch字段使用 AWS Lambda 函数,使用基于错误消息类型的条件逻辑进行响应。这是一种称为函数错误处理 的技术。

有关更多信息,请参阅 AWS Lambda Node.js 中的函数错误 AWS Lambda 开发者指南

注意

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

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

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

重要

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

  1. 打开 AWS Lambda 控制台位于https://console.aws.amazon.com/lambda/

  2. 选择 Create function (创建函数)

  3. 选择使用蓝图,在搜索框中输入 step-functions,然后选择抛出自定义错误蓝图。

  4. 对于函数名称,请输入 FailFunction

  5. 对于角色,保留默认选择(使用基本 Lambda 权限创建新角色)。

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

  7. 选择 Create function (创建函数)

  8. 创建 Lambda 函数后,复制页面右上角显示的函数的 Amazon 资源名称 (ARN)。以下是一个示例ARN:

    arn:aws:lambda:us-east-1:123456789012:function:FailFunction
  9. 选择部署

第 2 步:测试 Lambda 函数

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

  1. FailFunction页面上,选择 “测试” 选项卡,然后选择 “测试”。您无需创建测试事件。

  2. 执行结果下,展开详细信息以查看测试结果(模拟的错误)。

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

通过 Step Functions 控制台创建使用 任务工作流状态 状态和 Catch 字段的状态机。在 Task 状态中添加对您 Lambda 函数的引用。状态机调用 Lambda 函数,该函数将在执行过程中失败。Step Functions 重试函数两次,在两次重试之间使用指数回退。

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

  2. 选择模板对话框中,选择空白

  3. 选择 “选择” 以在中打开 “工作流工作室” 设计模式

  4. 选择代码,打开代码编辑器。在代码编辑器中,您可以编写和编辑工作流程的 Amazon States Language (ASL) 定义。

  5. 粘贴以下代码,但要替换您之前在该字段中创建的 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.UnknownStates.ALLStates.TaskFailed 来处理这些错误。当 Lambda 达到最大调用次数时,会出现 Lambda.TooManyRequestsException 错误。有关 Lambda HandledUnhandled错误的更多信息,请参阅中的 FunctionError AWS Lambda 开发者指南

  6. (可选)在图形可视化中,查看工作流的实时图形可视化。

  7. 为状态机指定一个名称。为此,请选择默认状态机名称旁边的编辑图标MyStateMachine。然后,找到状态机配置,在状态机名称框中指定一个名称。

    在本教程中,请输入 Catchfailure

  8. (可选)在状态机配置中,指定其他工作流设置,例如状态机类型及其执行角色。

    在本教程中,请保留状态机设置中的所有默认选项。

  9. 确认角色创建对话框中,选择确认继续。

    您也可以选择查看角色设置,返回至状态机配置

    注意

    如果你删除 Step Functions 创建的IAM角色,Step Functions 以后将无法重新创建它。同样,如果您修改角色(例如,通过从IAM策略的主体中删除 Step Functions),Step Functions 以后将无法恢复其原始设置。

第 4 步:运行状态机

在创建状态机后,便可以运行它。

  1. 状态机页面上,选择 Catchfailure

  2. Catchfailure 页面上,选择启动执行。随即显示启动执行对话框。

  3. 启动执行对话框中,执行以下操作:

    1. (可选)输入自定义执行名称以覆盖生成的默认值。

      非ASCII姓名和日志

      Step Functions 接受状态机、执行、活动和包含非ASCII字符的标签的名称。由于此类字符不适用于亚马逊 CloudWatch,因此我们建议您仅使用ASCII字符,以便您可以跟踪中的指标 CloudWatch。

    2. (可选)在 “输入” 框中,按JSON格式输入输入值以运行您的工作流程。

    3. 选择启动执行

    4. Step Functions 控制台会将您引导到一个以您的执行 ID 为标题的页面。该页面被称为执行详细信息页面。在此页面上,您可以随着执行的进展或者在执行完成后查看执行结果。

      要查看执行结果,请在图表视图上选择各个状态,然后在步骤详细信息窗格中选择各个选项卡,分别查看每个状态的详细信息,包括输入、输出和定义。有关可在执行详细信息页面上查看的执行信息的详细信息,请参阅执行详情概述

    例如,要查看您的自定义错误消息,请在图表视图中选择CreateAccount步骤,然后选择输出选项卡。

    带有执行错误消息的输出说明性屏幕截图。
    注意

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