使用 Lambda 迭代循环 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Lambda 迭代循环

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

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

在开始之前,请仔细阅读创建使用 Lambda 的 Step Functions 状态机教程,确保您熟悉如何同时使用 Lambda 和 Step Functions。

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

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

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

创建 Lambda 函数

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

  2. 创建函数页面上,选择从头开始创作

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

    1. 对于 Function name(函数名称),请输入 Iterator

    2. 对于 Runtime (运行时),选择 Node.js

    3. 更改默认执行角色中,选择创建具有基本 Lambda 权限的新角色

    4. 选择创建函数

  4. 将以下 Lambda 函数的代码复制到代码源中。

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

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

  5. 选择部署

第 2 步:测试 Lambda 函数

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

测试 Lambda 函数

  1. 选择测试

  2. 配置测试事件对话框中,在事件名称框中输入 TestIterator

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

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

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

  4. 选择 创建

  5. 选择 “测试” 以测试您的 Lambda 函数。

    测试结果显示在执行结果选项卡中。

  6. 要查看执行结果,请选择输出选项卡。

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

    如果设置index9并再次测试,则index增量为10continue将为。false

第 3 步:创建状态机

在你离开 Lambda 控制台之前...

复制 Lambda 函数 ARN。将其粘贴到笔记中。下一步中需要使用该值。

接下来,您将创建一个具有以下状态的状态机:

  • ConfigureCount— 设置countindex、和的默认值step

  • Iterator— 指您之前创建的 Lambda 函数,传入中配置的值。ConfigureCount

  • IsCountReached— 一种根据Iterator函数返回的值继续循环或继续进入Done状态的选择状态。

  • ExampleWork— 需要完成的工作的存根。在此示例中,工作流程有一个Pass状态,但在实际解决方案中,您可能会使用Task

  • Done— 工作流程的结束状态。

要在控制台中创建状态机,请执行以下操作:

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

    重要

    您的状态机必须与您的 Lambda 函数位于同一个 Amazon 账户和区域中。

  2. 选择空白模板。

  3. 在 “代码” 窗格中,粘贴以下定义状态机的 JSON。

    有关 Amazon States Language 的更多信息,请参阅状态机结构

    { "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: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 } } }
  4. 将该Iterator Resource字段替换为您之前创建的 Lambd Iterator a 函数的 ARN。

  5. 选择 Config,然后输入状态机的名称,例如IterateCount

    注意

    状态机、执行和活动任务的名称长度不得超过 80 个字符。对于您的账户和 Amazon 地区,这些名称必须是唯一的,并且不得包含以下任何内容:

    • 空格

    • 通配符 (? *)

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

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

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

    如果您的状态机是快速类型,则可以为状态机的多个执行提供相同的名称。即使多个执行的名称相同,Step Functions 也会为每个快速状态机执行生成唯一的执行 ARN。

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

  6. 对于 “类型”,接受默认值 “标准”。对于权限,选择创建新角色

  7. 选择创建,然后确认角色创建。

第 4 步:启动新的执行

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

  1. IterateCount页面上,选择开始执行

  2. (可选)要识别您的执行,您可以在名称框中为其指定一个名称。默认情况下,Step Functions 会自动生成一个唯一的执行名称。

    注意

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

  3. 选择启动执行

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

    
                            状态机图表视图,以蓝色显示 Iterator 状态以表示正在进行状态。

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

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

    
                                    状态机图表视图,以绿色显示 “迭代器” 状态和 “完成” 状态,表示两者均已成功。