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

使用 Lambda 迭代循环

在本教程中,将实现使用状态机和 AWS Lambda 函数迭代循环特定次数的设计模式。

无论何时您需要跟踪状态机中的循环数量,都可以使用此设计模式。此实现可帮助您将大型任务或长时间运行的执行分解为较小的块,或者在特定数量的事件之后结束执行。您可以使用类似的实现来定期结束并重新启动长时间运行的执行,以避免超出 AWS Step Functions、AWS Lambda 或其他 AWS 服务的服务限制。

在开始之前,请浏览创建 Lambda 状态机教程以确保您创建了必需的 IAM 角色,并且熟悉如何将 Lambda 和 Step Functions 结合使用。

步骤 1:创建迭代计数的 Lambda 函数

通过使用 Lambda 函数,您可以跟踪状态机中的循环迭代次数。以下 Lambda 函数接收 countindexstep 的输入值。它返回这些值及更新的 index 和一个名为 continue 的布尔值。如果 index 小于 count,Lambda 函数将 continue 设置为 true

然后,状态机实现 Choice 状态:在 continuetrue 时执行一些应用程序逻辑,在 continue 为 false 时退出。

创建 Lambda 函数

  1. 登录 Lambda 控制台,然后选择创建函数

  2. Create function (创建函数) 部分中,选择 Author with code snippets (使用代码段创作)

  3. Author with code snippets (使用代码段创作) 部分中,配置 Lambda 函数,如下所示:

    1. 对于名称,输入 Iterator

    2. 对于 Runtime,选择 Node.js 6.10

    3. 对于 Role,选择 Choose an existing role

    4. 对于现有角色,选择您在创建 Lambda 状态机教程中创建的 Lambda 角色。

      注意

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

    5. 选择 Create function

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

      arn:aws-cn:lambda:us-east-1:123456789012:function:Iterator
  4. 将以下 Lambda 函数代码复制到 Lambda 控制台中的迭代器 页面的配置部分中。

    exports.iterator = function iterator (event, context, callback) { let index = event.iterator.index let step = event.iterator.step let count = event.iterator.count index += step callback(null, { index, step, count, continue: index < count }) }

    此代码接受 countindexstep 的输入值。它将 index 递增 step 的值,并返回这些值及布尔值 continue。如果 index 小于 countcontinue 的值为 true

  5. 选择 Save

步骤 2:测试 Lambda 函数

使用数值运行您的 Lambda 函数,以查看其运行情况。您可以为模拟迭代的 Lambda 函数提供输入值,以查看使用特定输入值得到的输出。

测试 Lambda 函数

  1. 配置测试事件对话框中,选择创建新测试事件,然后输入 TestIterator 作为事件名称

  2. 使用以下内容替换示例数据。

    { "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }

    这些值模拟在迭代期间来自状态机的内容。Lambda 函数将递增索引并将 continue 返回为 true。当索引不小于 count 时,它会将 continue 返回为 false。在此测试中,索引已增加到 5。结果应将 index 增加到 6,并将 continue 设置为 true

  3. 选择 Create

  4. 在 Lambda 控制台中的迭代器 页面上,确保列出了 TestIterator,然后选择测试

    测试结果将显示在页面顶部。选择详细信息并查看结果。

    { "index": 6, "step": 1, "count": 10, "continue": true }

    注意

    如果在此测试中将 index 设置为 9,则 index 增加到 10continuefalse

步骤 3:创建状态机

创建状态机

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

    重要

    确保您的状态机与您之前创建的 Lambda 函数位于相同的 AWS 账户和区域下。

  2. Create a state machine(创建状态机) 页面上,选择 Author with code snippets (使用代码段创作)。对于Give a name to your state machine (为状态机指定名称),输入 IterateCount

    注意

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

    • 空格

    • 通配符 (? *)

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

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

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

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

    选择 Next (下一步)

  3. 创建或输入 IAM 角色。

    • 要为 Step Functions 创建新的 IAM 角色,请选择 Create an IAM role for me (为我创建 IAM 角色),然后输入角色的 Name (名称)

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

    注意

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

  4. 以下代码描述了一个具有以下状态的状态机。

    • ConfigureCount – 为 countindexstep 设置默认值。

      "ConfigureCount": { "Type": "Pass", "Result": { "count": 10, "index": 0, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" },
    • Iterator – 引用您之前创建的 Lambda 函数,传入在 ConfigureCount 中配置的值。

      "Iterator": { "Type": "Task", "Resource": "arn:aws-cn:lambda:us-east-1:123456789012:function:Iterate", "ResultPath": "$.iterator", "Next": "IsCountReached" },
    • IsCountReached – 一个选择状态,它将根据从您的 Iterator Lambda 函数返回的布尔值再次运行您的示例工作或转到 Done

      "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "Done" },
    • ExampleWork – 您希望在执行中完成的工作的存根。在本示例中,它是 pass 状态。在实际实现中,这将是 状态。请参阅 任务

    • Done – 执行的最终状态。

    Code (代码) 窗格中,使用您之前创建的 Lambda 函数的 Amazon 资源名称 (ARN) 添加以下状态机定义。

    { "Comment": "Iterator State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 10, "index": 0, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "arn:aws-cn:lambda:us-east-1:123456789012:function:Iterate", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "Done" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "Done": { "Type": "Pass", "End": true } } }

    务必更新上述处于 Iterator 状态的 ARN,以便它引用您之前创建的 Lambda 函数。有关 Amazon 状态语言的更多信息,请参阅状态机结构

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

    此图显示了前面状态机器代码中表达的逻辑。

    
                            状态机工作流程

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

  6. 选择 Next (下一步)

  7. 创建或输入 IAM 角色。

    • 要为 Step Functions 创建新的 IAM 角色,请选择 Create an IAM role for me (为我创建 IAM 角色),然后输入角色的 Name (名称)

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

    注意

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

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

步骤 4:启动新的执行

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

启动新的执行

  1. IterateCount 页面上,选择 New execution (新执行)。

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

    注意

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

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

    此时将开始状态机的新执行,并显示正在运行的执行。

    
                            状态机执行

    执行逐步递增,使用您的 Lambda 函数跟踪计数。在每次迭代时,它都会执行在状态机中处于 ExampleWork 状态引用的示例工作。

  4. (可选) 在 Execution Details 部分中,选择 Info 选项卡以查看 Execution Status 以及 StartedClosed 时间戳。

  5. 当计数达到您的状态机中 ConfigureCount 状态中指定的数值,执行停止迭代并结束。

    
                            状态机执行完成