本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Step Functions 中使用 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 权限的新角色。
-
选择 Create function (创建函数)。
-
-
将 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 函数将递增索引,当索引小于
count
时,将对于continue
返回true
。在此测试中,索引已增加到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
状态的 Choice 状态。 -
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
字段替换为您之前创建的Iterator
Lambda 函数的 ARN。 -
选择配置,然后为状态机输入名称,例如
。IterateCount
注意
状态机、执行和活动任务的名称长度不得超过 80 个字符。对于您的账户和 Amazon 区域,这些名称必须是唯一的,并且不得包含以下任何内容:
-
空格
-
通配符 (
? *
) -
方括号字符 (
< > { } [ ]
) -
特殊字符 (
" # % \ ^ | ~ ` $ & , ; : /
) -
控制字符(
\\u0000
-\\u001f
或\\u007f
-\\u009f
)
Step Functions 对于状态机、执行、活动和标签接受包含非 ASCII 字符的名称。由于此类字符不适用于 Amazon CloudWatch,因此我们建议您仅使用 ASCII 字符,这样您就可以在 CloudWatch 中跟踪指标。
-
-
对于类型,接受默认值标准。对于权限,选择创建新角色。
-
选择创建,然后确认角色创建。
第 4 步:启动新的执行
在创建您的状态机后,可以开始执行。
-
在 IterateCount 页面上,选择 启动执行。
-
(可选)输入自定义执行名称,以便覆盖生成的默认执行名称。
非 ASCII 名称和日志记录
Step Functions 对于状态机、执行、活动和标签接受包含非 ASCII 字符的名称。由于此类字符不适用于 Amazon CloudWatch,因此我们建议您仅使用 ASCII 字符,这样您就可以在 CloudWatch 中跟踪指标。
-
选择启动执行。
此时将开始状态机的新执行,并显示正在运行的执行。
执行逐步递增,使用您的 Lambda 函数跟踪计数。在每次迭代时,它都会执行在状态机中处于
ExampleWork
状态引用的示例工作。计数达到您的状态机中
ConfigureCount
状态中指定的数值后,执行停止迭代并结束。