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

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

使用 Lambda 迭代循环

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

当你需要跟踪状态机中的回路数量时,可以随时使用这种设计模式。此实现可帮助您将大型任务或长时间运行的执行分解为较小的块,或者在特定数量的事件之后结束执行。您可以使用类似的实现定期结束并重新启动长时间运行的执行,以避免超过Amazon Step FunctionsAmazon Lambda、或其他Amazon服务的服务配额。

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

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

通过使用 Lambda 函数,您可以跟踪状态机中循环的迭代次数。以下 Lambda 函数接收countindex、和的输入值step。它使用名为的更新后的index布尔值返回这些值continuetrue如果小于,则 Lambda 函数将设置continueindexcount

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

创建 Lambda 函数

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

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

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

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

    2. 对于 “运行时”,选择 Node.js 14.x

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

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

    5. 创建 Lambda 函数后,复制页面右上角显示的函数的亚马逊资源名称 (ARN)。要复制 ARN,请单击 
                                        copy Amazon Resource Name
                                    。以下是 ARN 示例:

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

    exports.handler = function iterator (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. 选择 Deploy(部署)。

步骤 2:测试 Lambda 函数

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

测试您的 Lambda 函数

  1. 选择 Test(测试)。

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

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

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

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

  4. 选择 Create(创建)

  5. 迭代器页面上,选择 “测试” 以测试您的 Lambda 函数。

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

  6. 选择 “执行结果” 选项卡查看输出。

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

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

步骤 3:创建状态机

使用 Step Functions 控制台创建具有以下状态的状态机,以调用您之前在步骤 1 中创建的 Lambda 函数

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

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

  • IsCountReached— 根据您的Iterator Lambda 函数返回的布尔值Done,该选择状态要么再次运行您的示例工作,要么转为。

  • ExampleWork— 你想在执行过程中完成的工作的存根。在这个例子中,它是一个Pass状态。在实际实现中,这将是一种Task状态。

  • Done— 执行的最终状态。

  1. 打开 Ste p Functions 控制台,然后选择 “创建状态机”。

    重要

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

  2. “选择创作方法” 页面上,选择 “用代码编写工作流程”。

  3. 对于 “类型”,保留默认选择,即 “标准”。

  4. 在 “定义” 窗格中,粘贴以下代码,但替换您之前在该Resource字段中创建的 Lambda 函数的 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: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 函数

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

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

    
              状态机工作流程

    有关亚马逊状态语言的更多信息,请参阅状态机结构

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

  6. 选择 Next(下一步)

  7. 输入状态机的名称,例如IterateCount

    注意

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

    • 空格

    • 通配符 (? *)

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

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

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

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

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

  8. 在 “权限” 中,选择 “创建新角色”。

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

步骤 4:启动新的执行

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

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

    屏幕上会显示 “开始执行” 对话框。

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

    注意

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

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

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

    
                            状态机执行

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

  4. (可选)在 “详细信息” 选项卡中,查看执行状态以及执行开始结束时间的时间戳。

    当计数达到状态机中ConfigureCount状态中指定的数字时,执行将退出迭代并结束。

    
                            状态机执行完成