使用 Lambda 函数继续执行新操作 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Lambda 函数继续执行新操作

您可以创建一个使用 Lambda 函数的状态机,在当前执行终止之前启动新的执行。使用这种方法在新执行中继续正在进行的工作,可以让你拥有一个可以将大型作业分解成较小工作流的状态机,或者让状态机无限期运行。

本教程建立在使用外部 Lambda 函数修改工作流程的概念之上,这一概念已在使用 Lambda 迭代循环教程。你使用相同的 Lambda 函数 (Iterator) 对循环进行特定次数的迭代。此外,您创建另一个 Lambda 函数以启动工作流程的新执行,并在每次启动新执行时递减计数。在输入中设置执行次数后,此状态机将结束并重新开始执行达指定的次数。

您将要创建的状态机可实施以下状态。

状态 目的

ConfigureCount

一个Pass配置的状态count,index,以及step价值观是IteratorLambda 函数用于逐步完成工作迭代。

Iterator

一个Task该状态引用了IteratorLambda 函数。

IsCountReached

一个Choice使用来自的布尔值的状态Iterator函数来决定状态机是应该继续示例工作,还是移至ShouldRestart州/省。

ExampleWork

一个Pass表示 tate (状态)Task状态将在实际实现中发挥作用。

ShouldRestart

一个Choice使用executionCount值来决定它应该结束一次执行然后开始另一次执行,还是干脆结束。

Restart

一个Task使用 Lambda 函数开始重新执行状态机的状态。与 Iterator 函数一样,此函数的计数也会递减。这些区域有:Restartstate 将计数的递减值传递给新执行的输入。

先决条件

在您开始之前,请查看创建使用 Lambda 的 Step Functions 状态机教程可确保您熟悉如何同时使用 Lambda 和 Step Functions。

第 1 步:创建 Lambda 函数来迭代计数

注意

如果你已经完成了使用 Lambda 迭代循环教程,您可以跳过此步骤,使用该 Lambda 函数。

本节和使用 Lambda 迭代循环教程显示如何使用 Lambda 函数跟踪计数,例如,状态机中循环的迭代次数。

以下 Lambda 函数接收的输入值count,index,以及step. 它返回这些值及更新的 index 和一个名为 continue 的布尔值。Lambda 函数集continuetrue如果index小于count.

然后,状态机实施 Choice 状态:在 continuetrue 时执行一些应用程序逻辑,或在 continuefalse 时继续执行 ShouldRestart

创建迭代 Lambda 函数

  1. 打开 Lambda 控制台,然后选择 Create function (创建函数)

  2. 创建函数页面上,选择从 Scratch 开始创作

  3. 基本信息部分,配置您的 Lambda 函数,如下所示:

    1. 对于 Function name(函数名称),请输入 Iterator

    2. 对于运行时,选择Node.js 16.x 16.x.

    3. 保留页面上的所有默认选项,然后选择创建函数.

      创建 Lambda 函数时,请在页面的右上角记下其亚马逊资源名称 (ARN),例如:

      arn:aws:lambda:us-east-1:123456789012:function:Iterator
  4. 将以下 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 }) }

    此代码接受 countindexstep 的输入值。它将 index 递增 step 的值,并返回这些值及布尔值 continue。如果 index 小于 countcontinue 的值为 true

  5. 选择部署来部署代码。

测试迭代 Lambda 函数

使用数字值运行 Iterate 函数,查看它的工作情况。您可以为模拟迭代的 Lambda 函数提供输入值,以查看使用特定输入值获得的输出。

测试您的 Lambda 函数

  1. 配置测试事件对话框中,选择创建新测试事件,然后键入 TestIterator 作为事件名称

  2. 使用以下内容替换示例数据。

    { "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }

    这些值模拟在迭代期间来自状态机的内容。Lambda 函数增加索引并返回continue如同true. 当索引不小于 count 时,它会将 continue 返回为 false。在此测试中,索引已增加到 5。结果应该增加index6并设置continuetrue.

  3. 选择Create(创建)。

  4. 迭代器请务必在您的 Lambda 控制台中打开页面TestIterator已列出,然后选择测试.

    测试结果将显示在页面顶部。选择详细信息并查看结果。

    { "index": 6, "step": 1, "count": 10, "continue": true }
    注意

    如果在此测试中将 index 设置为 9,则 index 增加到 10continuefalse

第 2 步:创建重启 Lambda 函数以开始执行新的Step Functions

  1. 打开 Lambda 控制台,然后选择 Create function (创建函数)

  2. 创建函数页面上,选择从 Scratch 开始创作

  3. 基本信息部分,配置您的 Lambda 函数,如下所示:

    1. 对于 Function name(函数名称),请输入 Restart

    2. 对于运行时,选择Node.js 16.x 16.x.

  4. 保留页面上的所有默认选项,然后选择创建函数.

    创建 Lambda 函数时,请在页面的右上角记下其亚马逊资源名称 (ARN),例如:

    arn:aws:lambda:us-east-1:123456789012:function:Iterator
  5. 将以下 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); }); }
  6. 选择部署来部署代码。

第 3 步:创建状态机

现在您已经创建了两个 Lambda 函数,请创建一个状态机。在此状态机中,ShouldRestartRestart 状态表示如何将工作拆分为多个执行。

例 ShouldRestart 选择状态

状态机的摘录显示了ShouldRestartChoice州/省。此状态决定是否应重新开始执行。

"ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 1, "Next": "Restart" } ],

初始执行的输入中包含 $.restart.executionCount 值。每次调用 Restart 函数后它会减 1,并置入每个后续执行的输入中。

例 重启任务状态

状态机的摘录显示了RestartTask州/省。此状态使用您之前创建的 Lambda 函数重新启动执行,并减少计数以跟踪要启动的剩余执行次数。

"Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" },
  1. Step Functions ct,选择创建状态机.

    重要

    确保你的状态机处于相同状态Amazon账户和区域作为您之前创建的 Lambda 函数。

  2. 将以下代码粘贴到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 } } }
  3. 更新Resource字符串在RestartIterator状态以引用您之前创建的相应的 Lambda 函数。

  4. 选择 Next(下一步)。

  5. 指定详细信息页面上,为状态机输入名称。例如,ContinueAsNew

  6. 保留页面上所有其他选项的默认选择,然后选择创建状态机.

  7. 将此状态机的亚马逊资源名称 (ARN) 保存在文本文件中。您需要在向 Lambda 函数提供权限的同时提供 ARN 才能开始执行新的 Step Functions。

第 4 步:更新 IAM 策略

为确保您的 Lambda 函数有权开始执行新的 Step Functions,请将行内策略附加到您用于您的 IAM 角色RestartLambda 函数。有关更多信息,请参阅 。嵌入内联策略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 以规定启动新执行的次数。

  1. ContinueAsNew页面,选择开始执行.

    这些区域有:开始执行对话框出现。

  2. (可选)要识别您的执行,可以在中为其指定一个名称名称盒子。默认情况下,Step Functions 会自动生成一个唯一的执行名称。

    注意

    Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于亚马逊 CloudWatch. 为了确保你可以追踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。

  3. 输入部分,在开始执行对话框中,输入以下内容作为执行输入:

    { "restart": { "StateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew", "executionCount": 4 } }
  4. 使用您的 ContinueAsNew 状态机的 ARN 更新 StateMachineArn 字段。

  5. 选择 Start Execution (开始执行)

Visual Workflow (可视工作流程) 图表显示四个执行中的第一个。在完成之前,它将传递 Restart 状态并启动新执行。


                四个执行中的第一个执行。

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


                一个执行完成,下一个执行相继运行。

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


                所有执行全部完成。