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