本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Lambda 迭代循环
在本教程中,将实现使用状态机和 Amazon Lambda 函数迭代循环特定次数的设计模式。
当你需要跟踪状态机中的回路数量时,可以随时使用这种设计模式。此实现可帮助您将大型任务或长时间运行的执行分解为较小的块,或者在特定数量的事件之后结束执行。您可以使用类似的实现定期结束并重新启动长时间运行的执行,以避免超过Amazon Step FunctionsAmazon Lambda、或其他Amazon服务的服务配额。
在开始之前,请先阅读创建使用 Lambda 的 Step Functions 状态机本教程,确保您熟悉如何同时使用 Lambda 和 Step Functions。
步骤 1:创建 Lambda 函数来迭代计数
通过使用 Lambda 函数,您可以跟踪状态机中循环的迭代次数。以下 Lambda 函数接收count
index
、和的输入值step
。它使用名为的更新后的index
布尔值返回这些值continue
。true
如果小于,则 Lambda 函数将设置continue
index
为count
。
然后,状态机实现 Choice
状态:在 continue
为 true
时执行一些应用程序逻辑,在 continue 为 false
时退出。
创建 Lambda 函数
-
登录 Lambda 控制台
,然后选择创建函数。 -
在创建函数页面上,选择从 Scratch 开始创作。
-
在基本信息部分中,配置您的 Lambda 函数,如下所示:
-
对于 Function name(函数名称),请输入
Iterator
。 -
对于 “运行时”,选择 Node.js 14.x。
-
在更改默认执行角色中,选择创建具有基本 Lambda 权限的新角色。
-
选择 Create function(创建函数)。
-
创建 Lambda 函数后,复制页面右上角显示的函数的亚马逊资源名称 (ARN)。要复制 ARN,请单击
。以下是 ARN 示例:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
-
将 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 }) }
此代码接受
count
、index
和step
的输入值。它将值index
递增step
并返回这些值,然后返回布尔值continue
。如果index
小于count
,continue
的值为true
。 -
选择 Deploy(部署)。
步骤 2:测试 Lambda 函数
使用数值运行您的 Lambda 函数,以查看其运行情况。您可以为模仿迭代的 Lambda 函数提供输入值,以查看使用特定输入值获得的输出。
测试您的 Lambda 函数
-
选择 Test(测试)。
-
在 “配置测试事件” 对话框中,
TestIterator
在 “事件名称” 框中输入。 -
使用以下内容替换示例数据。
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }
这些值模拟在迭代期间来自状态机的内容。Lambda 函数将增加索引并返回
continue
为true
。当索引不小于时count
,它将返回continue
为false
。在此测试中,索引已增加到5
。结果应增加 toindex
6
并设置continue
为true
。 -
选择 Create(创建)。
-
在
迭代器
页面上,选择 “测试” 以测试您的 Lambda 函数。测试结果显示在 “执行结果” 选项卡中。
-
选择 “执行结果” 选项卡查看输出。
{ "index": 6, "step": 1, "count": 10, "continue": true }
注意 如果在此测试中将
index
设置为9
,则index
增加到10
,continue
为false
。
步骤 3:创建状态机
使用 Step Functions 控制台
-
ConfigureCount
— 设置count
index
、和的默认值step
。 -
Iterator
— 引用您之前创建的 Lambda 函数,传入中配置的值ConfigureCount
。 -
IsCountReached
— 根据您的Iterator
Lambda 函数返回的布尔值Done
,该选择状态要么再次运行您的示例工作,要么转为。 -
ExampleWork
— 你想在执行过程中完成的工作的存根。在这个例子中,它是一个Pass
状态。在实际实现中,这将是一种Task
状态。 -
Done
— 执行的最终状态。
-
打开 Ste p Functions 控制台
,然后选择 “创建状态机”。 重要 确保您的状态机与您之前创建的 Lambda 函数位于同一个Amazon账户和区域。
-
在 “选择创作方法” 页面上,选择 “用代码编写工作流程”。
-
对于 “类型”,保留默认选择,即 “标准”。
-
在 “定义” 窗格中,粘贴以下代码,但替换您之前在该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 函数。 -
使用 Visual Workflow 窗格中的图表检查您的 Amazon States 语言代码是否正确描述了您的状态机。
此图显示了先前状态机代码中表达的逻辑。
有关亚马逊状态语言的更多信息,请参阅状态机结构。
如果您未看到该图表,请在
Visual Workflow 窗格中选择“”。
-
选择 Next(下一步)。
-
输入状态机的名称,例如
。IterateCount
注意 状态机、执行和活动名称的长度必须为 1—80 个字符,对于您的账户和Amazon区域必须是唯一的,并且不得包含以下任何内容:
-
空格
-
通配符 (
? *
) -
方括号字符 (
< > { } [ ]
) -
特殊字符 (
: ; , \ | ^ ~ $ # % & ` "
) -
控制字符(
\\u0000
-\\u001f
或\\u007f
-\\u009f
)。
如果您的状态机是 Express 类型,则可以为状态机的多次执行提供相同的名称。Step Functions 会为每次 Express 状态机执行生成唯一的执行 ARN,即使多个执行具有相同的名称。
Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于亚马逊 CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
-
在 “权限” 中,选择 “创建新角色”。
-
选择 Create state machine (创建状态机)。
步骤 4:启动新的执行
在创建您的状态机后,可以开始执行。
-
在IterateCount页面上,选择 “开始执行”。
屏幕上会显示 “开始执行” 对话框。
-
(可选)要识别您的执行,可以在 “名称” 框中为其指定名称。默认情况下,Step Functions 会自动生成一个唯一的执行名称。
注意 Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于亚马逊 CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
选择 Start Execution (开始执行)。
此时将开始状态机的新执行,并显示正在运行的执行。
执行分步递增,使用您的 Lambda 函数跟踪计数。在每次迭代时,它都会执行在状态机中处于
ExampleWork
状态引用的示例工作。 -
(可选)在 “详细信息” 选项卡中,查看执行状态以及执行开始和结束时间的时间戳。
当计数达到状态机中
ConfigureCount
状态中指定的数字时,执行将退出迭代并结束。