使用 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 创建 IAM 角色

Amazon Lambda 和 Amazon Step Functions 均可执行代码和访问 Amazon 资源 (例如,存储在 Amazon S3 存储桶中的数据)。为了保持安全性,您必须授予 Lambda 和 Step Functions 对这些资源的访问权限。

Lambda 要求您分配Amazon Identity and Access Management创建 Lambda 函数时 (IAM) 角色,其方式与您创建状态机时 Step Functions 要求您指定 IAM 角色相同。

  1. 登录到IAM 控制台然后选择角色创建角色.

  2. 在存储库的选择受信任实体的类型页面,下Amazon服务选择,选择Lambda从列表中选择,然后选择后续:Permissions (下一步:权限)

    注意

    该角色自动提供了信任关系,允许 Lambda 使用角色。

  3. 在存储库的附加权限策略在页面上,选择后续:审核

  4. 在存储库的审核页面,输入MyLambdaRole为了角色名称选择,然后选择创建角色.

IAM 角色显示在角色列表中。

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

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

重要

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

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

    选择创建函数

  2. 蓝图部分的筛选条件中输入 step-functions,然后选择 step-functions-error 蓝图。

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

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

    2. 对于 Role (角色),选择 Choose an existing role (选择现有角色)

    3. 适用于现有角色,选择您之前创建的 Lambda 角色.

      注意

      如果您创建的 IAM 角色未显示在列表中,该角色可能仍需要几分钟才能传播到 Lambda。

  4. 以下代码显示在Lambda 函数代码窗格。

    'use strict'; exports.handler = (event, context, callback) => { function CustomError(message) { this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error(); const error = new CustomError('This is a custom error!'); callback(error); };

    context 对象返回错误消息 This is a custom error!

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

    创建 Lambda 函数后,记下其亚马逊资源名称 (ARN) 位于页面右上角的亚马逊资源名称 (ARN),如以下示例所示。

    arn:aws:lambda:us-east-1:123456789012:function:FailFunction

第 3 步:测试 Lambda 函数

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

  1. FailFunction 页面上,选择 Test

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

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

    测试结果 (模拟错误) 显示在页面底部。

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

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

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

  2. 在存储库的创建状态机在页面上,选择从模板开始选择,然后选择抓取失败时.

  3. Type (类型) 下,选择 Standard (标准)

  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在错误输出中。这包括内存不足错误和函数超时。你可以匹配Lambda.UnknownStates.ALL,或者States.TaskFailed来处理这些错误。当 Lambda 达到最大调用次数时,错误是Lambda.TooManyRequestsException. 有关 Lambda 的更多信息HandledUnhandled错误,请参阅FunctionError中的Amazon Lambda开发人员指南.

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

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

  6. 选择下一步

  7. 输入名称为了使用状态机,或使用默认名称,Catchfailure.

  8. 选择选择现有角色mylambdarole在下拉列表中。

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

第 5 步:启动新的执行

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

  1. 在存储库的CatchStateMachine在页面上,选择启动执行.

    此时将显示 New execution 页面。

  2. (可选)为了帮助识别您的执行情况,您可以在输入执行名称。如果未输入 ID,Step Functions 将自动生成一个唯一 ID。

    注意

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

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

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

  4. 要查看工作流程的输出,请在 Execution Details (执行详细信息) 部分展开 Output (输出) 部分。

    
                            执行输出
  5. 要查看您的自定义错误消息,请选择 CreateAccountVisual workflow (可视工作流程) 中的 ,并展开 Output (输出) 部分。

    
                            错误输出
    注意

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