使用 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(IAM) 角色,其方式与您创建 Lambda 函数相同。

  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/

    选择 Create a function

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

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

    1. 对于名称,输入 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. 选择创建函数

    创建 Lambda 函数后,记下函数位于页面右上角的 Amazon 资源名称 (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 函数中添加对 Lambda 函数的引用。Task状态。Lambda 函数被调用并在执行期间失败。Step Functions 重试函数两次,在两次重试之间使用指数回退。

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

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

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

  4. 代码窗格中,添加您之前创建的 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 字段的语法的更多信息,请参阅使用 “重试” 和 “捕获” 的示例

    注意

    Lambda 中的未处理错误报告为Lambda.Unknown在错误输出中。这些问题包括内存不足错误和函数超时。您可以匹配Lambda.UnknownStates.ALL,或者States.TaskFailed来处理这些错误。当 Lambda 达到最大调用次数时,错误为Lambda.TooManyRequestsException。有关 Lambda 的更多信息HandledUnhandled错误,请参阅FunctionError中的Amazon Lambda开发人员指南

  5. 使用可视工作流窗格可检查您的 Amazon State (状态机) 语言代码是否正确描述了状态机。

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

  6. 选择 Next

  7. 输入名称,或使用默认名称Catchfailure

  8. 选择选择现有角色米兰·达罗在下拉列表中。

  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 中包含错误和输入