本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Lambda 迭代循环
在本教程中,将实现使用状态机和 Amazon Lambda 函数迭代循环特定次数的设计模式。
无论何时您需要跟踪状态机中的循环数量,都可以使用此设计模式。此实现可帮助您将大型任务或长时间运行的执行分解为较小的块,或者在特定数量的事件之后结束执行。您可以使用类似的实现来定期结束并重新启动长时间运行的执行,以避免超出服务配额。Amazon Step Functions、Amazon Lambda或其他Amazon服务。
在开始之前,请通过创建 Step Functions 状态机器这使用 Lambda教程,以确保您创建了必需的 IAM 角色,并且熟悉如何将 Lambda 和 Step Functions 结合使用。
第 1 步:创建 Lambda 函数以迭代计数
通过使用 Lambda 函数,您可以跟踪状态机中的循环迭代次数。以下 Lambda 函数接收的输入值count
、index
, 和step
. 它返回这些值及更新的值index
和一个名为的布尔值continue
. Lambda 函数集continue
到true
如果index
小于count
.
然后,状态机实现 Choice
状态:在 continue
为 true
时执行一些应用程序逻辑,在 continue 为 false
时退出。
创建 Lambda 函数
-
登录到Lambda 控制台
,然后选择创建函数. -
在创建函数部分中,选择从头开始创作。
-
在基本信息部分中,配置 Lambda 函数,如下所示:
-
对于 Function name (函数名称),请输入
Iterator
。 -
适用于运行时,选择Node.js 12.x.
-
对于 Role (角色),选择 Use an existing role (使用现有角色)。
-
适用于现有角色选 Lambda 您在创建 Step Functions 状态机器这使用 Lambda教程。
注意 如果您创建的 IAM 角色未显示在列表中,该角色可能仍需要几分钟才能传播到 Lambda。
-
选择 Create function(创建函数)。
创建 Lambda 函数后,记下函数位于页面右上角的 Amazon 资源名称 (ARN),如图所示。
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
-
将 Lambda 函数的以下代码复制到配置的 部分
迭代器
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 }) }
此代码接受
count
、index
和step
的输入值。它将递增index
按照的价值step
并返回这些值,并返回布尔值continue
. 如果index
小于count
,continue
的值为true
。 -
选择 Save (保存)。
第 2 步:测试 Lambda 函数
使用数值运行您的 Lambda 函数,以便在操作中查看它。您可以为模拟迭代的 Lambda 函数提供输入值,以查看使用特定输入值得到的输出。
测试 Lambda 函数
-
在配置测试事件对话框中,选择创建新测试事件,然后输入
TestIterator
为了Event name (事件名称). -
使用以下内容替换示例数据。
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }
这些值模拟在迭代期间来自状态机的内容。Lambda 函数将递增索引并返回
continue
如同true
. 当指数不小于count
,它返回continue
如同false
. 在此测试中,索引已增加到5
。结果应增加index
到6
并设置continue
到true
. -
选择 Create (创建)。
-
在存储库的
迭代器
请务必在 Lambda 控制台中使用页面TestIterator已列出,然后选择测试.测试结果将显示在页面顶部。选择详细信息并查看结果。
{ "index": 6, "step": 1, "count": 10, "continue": true }
注意 如果在此测试中将
index
设置为9
,则index
增加到10
,continue
为false
。
第 3 步:创建状态机
-
登录到Step Functions
,然后选择创建状态机. 重要 确保您的状态机位于相同的状态机之下Amazon账户和区域为您之前创建的 Lambda 函数。
-
在 Define state machine (定义状态机) 页面上,选择 Author with code snippets (使用代码段创作)。对于 Type(类型),选择 Standard(标准)。对于 Name (名称),请输入
IterateCount
。注意 状态机、执行和活动名称的长度必须为 1-80 个字符,对于您的账户必须是唯一的,Amazon区域,且不得包含以下任何内容:
-
空格
-
通配符 (
? *
) -
括号字符 (
< > { } [ ]
) -
特殊字符 (
: ; , \ | ^ ~ $ # % & ` "
) -
控制字符 (
\\u0000
-\\u001f
要么\\u007f
-\\u009f
)。
Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
选择 Next(下一步)。
-
-
创建或输入 IAM 角色:
-
要为 Step Functions 创建 IAM 角色,请选择为我创建 IAM 角色,然后输入名称为您的角色。
-
如果您之前创建 IAM 角色选择您的状态机的正确权限选择现有 IAM 角色. 从列表中选择角色,或为该角色提供 ARN。
注意 如果您删除了 Step Functions 创建的 IAM 角色,Step Functions 在以后无法重新创建它。同样,如果您修改角色 (例如,通过在 IAM 策略中从委托人删除步骤 Functions),Step Functions 在以后无法还原其原始设置。
-
-
以下代码描述了一个具有以下状态的状态机。
-
ConfigureCount
— 为设置默认值count
、index
, 和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
,基于从您的返回的布尔值Iterator
Lambda 函数。"IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "Done" },
-
ExampleWork
— 您希望在执行中完成的工作的存根。在此示例中,它是pass
状态。在实际实现中,这将是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 } } }请务必 ARN
Iterator
上述状态,以便它引用了您之前创建的 Lambda 函数。有关亚马逊州语言的更多信息,请参阅状态机结构. -
-
使用中的图表可视工作流窗格,以检查您的 Amazon State Services 代码是否正确描述了状态机。
此图显示了之前的状态机器代码中表达的逻辑。
如果您未看到该图表,请在
Visual Workflow 窗格中选择“”。
-
选择下一步。
-
创建或输入 IAM 角色:
-
要为 Step Functions 创建 IAM 角色,请选择为我创建 IAM 角色,然后输入名称为您的角色。
-
如果您之前创建 IAM 角色选择您的状态机的正确权限选择现有 IAM 角色. 从列表中选择角色,或为该角色提供 ARN。
注意 如果您删除了 Step Functions 创建的 IAM 角色,Step Functions 在以后无法重新创建它。同样,如果您修改角色 (例如,通过在 IAM 策略中从委托人删除步骤 Functions),Step Functions 在以后无法还原其原始设置。
-
-
选择 Create state machine (创建状态机)。
第 4 步:启动新的执行
在创建您的状态机后,可以开始执行。
-
在 IterateCount 页面上,选择 New execution (新执行)。
-
(可选) 为了帮助识别您的执行,您可以在输入执行名称。如果未输入 ID,Step Functions 将自动生成一个唯一 ID。
注意 Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
选择 Start Execution (开始执行)。
此时将开始状态机的新执行,并显示正在运行的执行。
执行逐步递增,使用您的 Lambda 函数跟踪计数。在每次迭代时,它都会执行在状态机中处于
ExampleWork
状态引用的示例工作。 -
(可选) 在 Execution Details 部分中,选择 Info 选项卡以查看 Execution Status 以及 Started 和 Closed 时间戳。
-
当计数达到中指定的数字时
ConfigureCount
状态中的状态,执行停止迭代并结束。