本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Lambda 函数继续执行新操作
您可以创建一个使用 Lambda 函数的状态机,在当前执行终止之前启动新的执行。使用这种方法在新执行中继续正在进行的工作,可以让你拥有一个可以将大型作业分解成较小工作流的状态机,或者让状态机无限期运行。
本教程建立在使用外部 Lambda 函数修改工作流程的概念之上,这一概念已在使用 Lambda 迭代循环教程。你使用相同的 Lambda 函数 (Iterator
) 对循环进行特定次数的迭代。此外,您创建另一个 Lambda 函数以启动工作流程的新执行,并在每次启动新执行时递减计数。在输入中设置执行次数后,此状态机将结束并重新开始执行达指定的次数。
您将要创建的状态机可实施以下状态。
状态 | 目的 |
---|---|
|
一个 |
|
一个 |
|
一个Choice 使用来自的布尔值的状态Iterator 函数来决定状态机是应该继续示例工作,还是移至ShouldRestart 州/省。 |
|
一个Pass 表示 tate (状态)Task 状态将在实际实现中发挥作用。 |
|
一个Choice 使用executionCount 值来决定它应该结束一次执行然后开始另一次执行,还是干脆结束。 |
|
一个Task 使用 Lambda 函数开始重新执行状态机的状态。与 Iterator 函数一样,此函数的计数也会递减。这些区域有:Restart state 将计数的递减值传递给新执行的输入。 |
先决条件
在您开始之前,请查看创建使用 Lambda (Step Functions 状态机)教程可确保您熟悉如何同时使用 Lambda 和 Step Functions。
主题
第 1 步:创建 Lambda 函数来迭代计数
注意
如果你已经完成了使用 Lambda 迭代循环教程,您可以跳过此步骤,使用该 Lambda 函数。
本节和使用 Lambda 迭代循环教程显示如何使用 Lambda 函数跟踪计数,例如,状态机中循环的迭代次数。
以下 Lambda 函数接收的输入值count
,index
,以及step
. 它返回这些值及更新的 index
和一个名为 continue
的布尔值。Lambda 函数集continue
到true
如果index
小于count
.
然后,状态机实施 Choice
状态:在 continue
为 true
时执行一些应用程序逻辑,或在 continue
为 false
时继续执行 ShouldRestart
。
创建迭代 Lambda 函数
-
打开 Lambda 控制台
,然后选择 Create function (创建函数)。 -
在创建函数页面上,选择从 Scratch 开始创作。
-
在基本信息部分,配置您的 Lambda 函数,如下所示:
-
对于 Function name(函数名称),请输入
Iterator
。 -
对于运行时,选择Node.js 16.x 16.x.
-
保留页面上的所有默认选项,然后选择创建函数.
创建 Lambda 函数时,请在页面的右上角记下其亚马逊资源名称 (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 = index + step; callback(null, { index, step, count, continue: index < count }) }
此代码接受
count
、index
和step
的输入值。它将index
递增step
的值,并返回这些值及布尔值continue
。如果index
小于count
,continue
的值为true
。 -
选择部署来部署代码。
测试迭代 Lambda 函数
使用数字值运行 Iterate
函数,查看它的工作情况。您可以为模拟迭代的 Lambda 函数提供输入值,以查看使用特定输入值获得的输出。
测试您的 Lambda 函数
-
在配置测试事件对话框中,选择创建新测试事件,然后键入
TestIterator
作为事件名称。 -
使用以下内容替换示例数据。
{ "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
。
第 2 步:创建重启 Lambda 函数以开始执行新的Step Functions
-
打开 Lambda 控制台
,然后选择 Create function (创建函数)。 -
在创建函数页面上,选择从 Scratch 开始创作。
-
在基本信息部分,配置您的 Lambda 函数,如下所示:
-
对于 Function name(函数名称),请输入
Restart
。 -
对于运行时,选择Node.js 16.x 16.x.
-
-
保留页面上的所有默认选项,然后选择创建函数.
创建 Lambda 函数时,请在页面的右上角记下其亚马逊资源名称 (ARN),例如:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
将以下 Lambda 函数代码复制到代码源部分
重启
Lambda 控制台中的页面。以下代码可将执行次数的计数递减,并启动状态机的新执行,包括已递减的值。
var aws = require('aws-sdk'); var sfn = new aws.StepFunctions(); exports.restart = function(event, context, callback) { let StateMachineArn = event.restart.StateMachineArn; event.restart.executionCount -= 1; event = JSON.stringify(event); let params = { input: event, stateMachineArn: StateMachineArn }; sfn.startExecution(params, function(err, data) { if (err) callback(err); else callback(null,event); }); }
-
选择部署来部署代码。
第 3 步:创建状态机
现在您已经创建了两个 Lambda 函数,请创建一个状态机。在此状态机中,ShouldRestart
和 Restart
状态表示如何将工作拆分为多个执行。
例 ShouldRestart 选择状态
状态机的摘录显示了ShouldRestart
Choice
州/省。此状态决定是否应重新开始执行。
"ShouldRestart": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.restart.executionCount",
"NumericGreaterThan": 1,
"Next": "Restart"
}
],
初始执行的输入中包含 $.restart.executionCount
值。每次调用 Restart
函数后它会减 1,并置入每个后续执行的输入中。
例 重启任务状态
状态机的摘录显示了Restart
Task
州/省。此状态使用您之前创建的 Lambda 函数重新启动执行,并减少计数以跟踪要启动的剩余执行次数。
"Restart": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart
",
"Next": "Done"
},
-
在Step Functions ct
,选择创建状态机. 重要
确保你的状态机处于相同状态Amazon账户和区域作为您之前创建的 Lambda 函数。
-
将以下代码粘贴到
Definition
窗格。{ "Comment": "Continue-as-new State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 100, "index": -1, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "
arn:aws:lambda:us-east-1:123456789012:function:Iterator
", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "ShouldRestart" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 0, "Next": "Restart" } ], "Default": "Done" }, "Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart
", "Next": "Done" }, "Done": { "Type": "Pass", "End": true } } } -
更新
Resource
字符串在Restart
和Iterator
状态以引用您之前创建的相应的 Lambda 函数。 -
选择 Next(下一步)。
-
在指定详细信息页面上,为状态机输入名称。例如,
ContinueAsNew
。 -
保留页面上所有其他选项的默认选择,然后选择创建状态机.
-
将此状态机的亚马逊资源名称 (ARN) 保存在文本文件中。您需要在向 Lambda 函数提供权限的同时提供 ARN 才能开始执行新的 Step Functions。
第 4 步:更新 IAM 策略
为确保您的 Lambda 函数有权开始执行新的 Step Functions,请将行内策略附加到您用于您的 IAM 角色Restart
Lambda 函数。有关更多信息,请参阅 。嵌入内联策略在IAM 用户指南.
注意
您可以更新上个示例的 Resource
行,引用 ContinueAsNew
状态机的 ARN。这会限制该策略,使它只能启动特定状态机的执行。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": "
arn:aws:states:us-east-2:123456789012stateMachine:ContinueAsNew
" } ] }
第 5 步:运行执行
要开始执行,请在输入中包含状态机的 ARN,并提供 executionCount
以规定启动新执行的次数。
-
在ContinueAsNew页面,选择开始执行.
这些区域有:开始执行对话框出现。
-
(可选)要识别您的执行,可以在中为其指定一个名称名称盒子。默认情况下,Step Functions 会自动生成一个唯一的执行名称。
注意
Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于亚马逊 CloudWatch. 为了确保你可以追踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。
-
在输入部分,在开始执行对话框中,输入以下内容作为执行输入:
{ "restart": { "StateMachineArn": "
arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew
", "executionCount":4
} } -
使用您的
ContinueAsNew
状态机的 ARN 更新StateMachineArn
字段。 -
选择 Start Execution (开始执行)。
Visual Workflow (可视工作流程) 图表显示四个执行中的第一个。在完成之前,它将传递 Restart
状态并启动新执行。

此执行完成后,您可以查看下一个正在运行的执行。选择ContinueAsNew顶部的链接可查看处决列表。你应该看到最近结束的处决和正在进行的执行Restart
Lambda 函数已启动。

所有执行全部完成后,您应在列表中看到四个成功完成的执行。启动的首个执行显示您所选的名称,后续执行的名称是自动生成的。
