本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Lambda 迭代循环
在本教程中,将实现使用状态机和 Amazon Lambda 函数迭代循环特定次数的设计模式。
无论何时您需要跟踪状态机中的循环数量,都可以使用此设计模式。此实现可帮助您将大型任务或长时间运行的执行分解为较小的块,或者在特定数量的事件之后结束执行。您可以使用类似的实现来定期结束和重启长时间运行的执行,以避免超过 Amazon Step Functions Amazon Lambda、或其他 Amazon 服务的服务配额。
在开始之前,请仔细阅读创建使用 Lambda 的 Step Functions 状态机教程,确保您熟悉如何同时使用 Lambda 和 Step Functions。
第 1 步:创建迭代计数的 Lambda 函数
通过使用 Lambda 函数,您可以跟踪状态机中的循环迭代次数。以下 Lambda 函数接收 count
、index
和 step
的输入值。它返回这些值及更新的 index
和一个名为 continue
的布尔值。如果 continue
小于 true
,Lambda 函数将 index
设置为 count
。
然后,状态机实现 Choice
状态:在 continue
为 true
时执行一些应用程序逻辑,为 false
时,则退出。
创建 Lambda 函数
-
登录 Lambda 控制台
,然后选择创建函数。 -
在创建函数页面上,选择从头开始创作。
-
在基本信息部分中,配置您的 Lambda 函数:
-
对于函数名称,请输入
Iterator
。 -
对于 Runtime (运行时),选择 Node.js。
-
在更改默认执行角色中,选择创建具有基本 Lambda 权限的新角色。
-
选择创建函数。
-
-
将以下 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 }) }
此代码接受
count
、index
和step
的输入值。它将index
递增step
的值,并返回这些值及布尔值continue
。如果index
小于count
,continue
的值为true
。 -
选择部署。
第 2 步:测试 Lambda 函数
使用数值运行您的 Lambda 函数,以查看其运行情况。您可以为 Lambda 函数提供模拟迭代的输入值。
测试 Lambda 函数
-
选择测试。
-
在 配置测试事件对话框中,在事件名称框中输入
TestIterator
。 -
使用以下内容替换示例数据。
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }
这些值模拟在迭代期间来自状态机的内容。Lambda 函数将增加索引,并在索引小
true
于continue
时返回。count
在此测试中,索引已增加到5
。测试将递增index
到,6
并设置continue
为。true
-
选择创建。
-
选择 “测试” 以测试您的 Lambda 函数。
测试结果显示在执行结果选项卡中。
-
要查看执行结果,请选择输出选项卡。
{ "index": 6, "step": 1, "count": 10, "continue": true }
注意
如果设置
index
为9
并再次测试,则index
增量为10
、continue
将为。false
第 3 步:创建状态机
在你离开 Lambda 控制台之前...
复制 Lambda 函数 ARN。将其粘贴到便条中。下一步中需要使用该值。
接下来,您将创建一个具有以下状态的状态机:
-
ConfigureCount
— 设置count
index
、和的默认值step
。 -
Iterator
— 指您之前创建的 Lambda 函数,传入中配置的值。ConfigureCount
-
IsCountReached
— 一种根据Iterator
函数返回的值继续循环或继续进入Done
状态的选择状态。 -
ExampleWork
— 需要完成的工作的存根。在此示例中,工作流程有一个Pass
状态,但在实际解决方案中,您可能会使用Task
。 -
Done
— 工作流程的结束状态。
要在控制台中创建状态机,请执行以下操作:
-
打开 Step Functions 控制台
,然后选择创建状态机。 重要
您的状态机必须与您的 Lambda 函数位于同一个 Amazon 账户和区域中。
-
选择 “空白” 模板。
-
在 “代码” 窗格中,粘贴以下定义状态机的 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 } } } -
将该
Iterator Resource
字段替换为您之前创建的 LambdIterator
a 函数的 ARN。 -
选择 Config,然后输入状态机的名称,例如
。IterateCount
注意
状态机、执行和活动任务的名称长度不得超过 80 个字符。对于您的账户和 Amazon 地区,这些名称必须是唯一的,并且不得包含以下任何内容:
-
空格
-
通配符 (
? *
) -
方括号字符 (
< > { } [ ]
) -
特殊字符 (
" # % \ ^ | ~ ` $ & , ; : /
) -
控制字符(
\\u0000
-\\u001f
或\\u007f
-\\u009f
)
如果您的状态机是快速类型,则可以为状态机的多个执行提供相同的名称。即使多个执行的名称相同,Step Functions 也会为每个快速状态机执行生成唯一的执行 ARN。
Step Functions 允许您为状态机、执行和活动创建名称,以及包含非 ASCII 字符的标签。这些非 ASCII 名称不适用于亚马逊。 CloudWatch为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
-
对于 “类型”,接受默认值 “标准”。在 “权限” 中,选择 “创建新角色”。
-
选择 “创建”,然后选择 “确认角色创建”。
第 4 步:启动新的执行
在创建您的状态机后,可以开始执行。
-
在IterateCount页面上,选择 “开始执行”。
-
(可选)要识别您的执行,您可以在名称框中为其指定一个名称。默认情况下,Step Functions 会自动生成一个唯一的执行名称。
注意
Step Functions 允许您为状态机、执行和活动创建名称,以及包含非 ASCII 字符的标签。这些非 ASCII 名称不适用于亚马逊。 CloudWatch为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
选择启动执行。
此时将开始状态机的新执行,并显示正在运行的执行。
执行逐步递增,使用您的 Lambda 函数跟踪计数。在每次迭代时,它都会执行在状态机中处于
ExampleWork
状态引用的示例工作。计数达到您的状态机中
ConfigureCount
状态中指定的数值后,执行停止迭代并结束。