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

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

使用 Lambda 迭代循环

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

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

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

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

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

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

创建 Lambda 函数

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

  2. 创建函数部分中,选择从头开始创作

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

    1. 函数名称中,输入 Iterator

    2. 适用于运行时中,选择Node.js 12.x

    3. 对于 Role (角色),选择 Use an existing role (使用现有角色)

    4. 适用于现有角色中,选择您在创建 Step Functions 状态Machine使用 Lambda教程。

      注意

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

    5. 选择创建函数

      创建 Lambda 函数后,记下函数位于页面右上角的 Amazon 资源名称 (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 += 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对于 来说为Event name (事件名称)

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

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

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

  3. 选择 Create (创建)

  4. 在存储库的迭代器页面,请确保TestIterator,然后选择测试

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

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

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

第 3 步:创建状态机

  1. 登录到Step Functions 控制台,然后选择创建状态机

    重要

    确保您的状态机位于相同的Amazon帐户和区域作为您之前创建的 Lambda 函数。

  2. Define state machine (定义状态机) 页面上,选择 Author with code snippets (使用代码段创作)。适用于类型中,选择标准。对于名称,输入 IterateCount

    注意

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

    • 空格

    • 通配符 (? *

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

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

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

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

    选择 Next (下一步)

  3. 创建或输入 IAM 角色:

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

    • 如果您有之前创建 IAM 角色使用您的状态机的正确权限,选择选择现有 IAM 角色。从列表中选择角色,或为该角色提供 ARN。

    注意

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

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

    • ConfigureCount— 设置默认值countindex, 和step

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

      "Iterator": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Iterate", "ResultPath": "$.iterator", "Next": "IsCountReached" },
    • IsCountReached— 一个选择状态,可以再次运行示例工作或转到Done,基于从IteratorLambda 函数。

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

    • Done— 执行的最终状态。

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

    { "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状态,以便它引用您之前创建的 Lambda 函数。有关亚马逊语言的更多信息,请参阅状态机结构

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

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

    
              状态机工作流程

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

  6. 选择 Next

  7. 创建或输入 IAM 角色:

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

    • 如果您有之前创建 IAM 角色使用您的状态机的正确权限,选择选择现有 IAM 角色。从列表中选择角色,或为该角色提供 ARN。

    注意

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

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

第 4 步:启动新的执行

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

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

  2. (可选) 为了帮助识别您的执行,您可以在输入执行名称。如果未输入 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状态,执行退出迭代并结束。

    
                            状态机执行完成