AWS Step Functions
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用状态机处理错误情形

在本教程中,您将创建具有 Catch 字段的 AWS Step Functions 状态机,该状态机使用 AWS Lambda 函数,根据错误消息类型使用条件逻辑做出响应。这是一种称为函数错误处理 的技术。

有关更多信息,请参阅 AWS Lambda Developer Guide 中的函数错误处理

注意

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

步骤 1:为 Lambda 创建 IAM 角色

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

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

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

  2. 选择受信任实体的类型页面上的 AWS 服务下,从列表中选择 Lambda,然后选择下一步: 权限

    注意

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

  3. 附加权限策略页面上,选择下一步: 审核

  4. 审核页面上,为角色名称 输入 MyLambdaRole,然后选择创建角色

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

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

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

重要

确保您的 Lambda 函数与状态机位于同一 AWS 账户和 AWS 区域下。

  1. 通过以下网址打开 AWS Lambda 控制台:https://console.amazonaws.cn/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. 选择 Create function

    创建您的 Lambda 函数后,记下页面右上角的 Amazon 资源名称 (ARN)。例如:

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

步骤 3:测试 Lambda 函数

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

  1. FailFunction 页面上,选择 Test

  2. 配置测试事件对话框中,为事件名称输入 FailFunction,然后选择创建

  3. FailFunction 页面上,对您的 Lambda 函数进行测试

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

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

通过 Step Functions 控制台创建使用 Task 状态和 Catch 字段的状态机。在 Task 状态中添加对您的 Lambda 函数的引用。这会调用 Lambda 函数并在执行期间失败。Step Functions 重试函数两次,在两次重试之间使用指数回退。

  1. 打开 Step Functions 控制台,然后选择 Create state machine (创建状态机)

  2. Create a state machine (创建状态机) 页面上,选择 Templates (模板),然后选择 Catch failure (捕捉失败)

  3. Name your state machine (为状态机命名),例如 Catchfailure

    注意

    状态机名称、执行名称和活动名称的长度必须是 1–80 个字符,在您的账户和 AWS 区域中必须是唯一的,并且不得包含以下任何内容:

    • 空格

    • 通配符 (? *)

    • 括号字符 (< > { } [ ])

    • 特殊字符 (: ; , \ | ^ ~ $ # % & ` ")

    • 控制字符 (\\u0000 - \\u001f\\u007f - \\u009f)。

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

  4. Code (代码) 窗格中,将您之前创建的 Lambda 函数的 ARN 添加到 Resource 字段,例如:

    { "Comment": "A Catch example of the Amazon States Language using an AWS Lambda function", "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws-cn: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 状态语言的状态机的说明。它定义了名为 CreateAccount 的单个 Task 状态。有关更多信息,请参阅状态机结构

    有关 Retry 字段语法的更多信息,请参阅出错后重试

    注意

    Lambda 中未处理的错误在错误输出中报告为 Lambda.Unknown。这些包括内存不足错误、函数超时,以及达到并发 Lambda 调用限制。您可以根据 Lambda.UnknownStates.ALLStates.TaskFailed 比对来处理这些错误。有关 Lambda HandledUnhandled 错误的更多信息,请参阅AWS Lambda Developer Guide中的 FunctionError

  5. 使用 Visual Workflow 窗格中的图表检查您的 Amazon 状态语言 代码是否正确描述了状态机。

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

  6. 选择 Next (下一步)

  7. 创建或输入 IAM 角色:

    • 要为 Step Functions 创建 IAM 角色,请选择为我创建 IAM 角色,然后输入角色的名称

    • 如果您使用您的状态机的正确权限之前已创建 IAM 角色,请选择 Choose an existing IAM role (选择现有 IAM 角色)。从列表中选择一个角色,或者提供该角色的 ARN。

    注意

    如果您删除了 Step Functions 创建的 IAM 角色,Step Functions 在以后无法重新创建它。同样,如果您修改角色 (例如,通过在 IAM 策略中从委托人删除 Step Functions),Step Functions 在以后无法还原其原始设置。

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

步骤 5:启动新的执行

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

  1. CatchStateMachine 页面上,选择 New execution

    此时将显示 New execution 页面。

  2. (可选) 为帮助您标识执行,您可以在 Enter an execution name 框中为执行指定一个 ID。如果未输入 ID,Step Functions 将自动生成一个唯一 ID。

    注意

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

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

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

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

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

    
                            错误输出

    注意

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