本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
状态机应用程序模式
在 Step Functions 中,您可以使用状态机来编排您的资源,状态机使用称为 Amazon 状态语言的基于 JSON 的结构化语言进行定义。
状态机组件
状态机包含称为状态的元素,这些元素将组成工作流。每个状态的逻辑决定下一个状态、要传递的数据以及何时终止工作流。状态通过其名称来引用,其名称可以是任意字符串,但在整个状态机的范围内必须唯一。
要创建使用 Lambda 的状态机,需要以下几个组件:
-
Lambda 的 Amazon Identity and Access Management (IAM) 角色,具有一个或多个权限策略(例如AWSLambdaRole
服务权限)。 -
用于特定运行时的一个或多个 Lambda 函数(附加了 IAM 角色)。
-
以 Amazon 状态语言编写的状态机。
状态机应用程序模式
您可以使用应用程序模式为状态机创建复杂的编排,例如:
-
捕获并重试-使用复杂的 catch-and-retry 功能处理错误。
-
分支 – 将工作流设计为根据 Lambda 函数的输出来选择不同的分支。
-
链接 – 通过将上一个步骤的输出作为下一个步骤的输入将函数连接为一系列步骤。
-
并行 – 并行运行函数,或者使用动态并行为任何数组中的每个成员调用函数。
将模式应用到状态机
下面介绍如何将这些应用程序模式应用到 Amazon 状态语言定义中的状态机。
- 捕获并重试
-
Catch
字段和Retry
字段为状态机添加 catch-and-retry 逻辑。Catch ("Type": "Catch"
) 是定义回退状态的对象数组。Retry ("Type": "Retry"
) 是定义状态遇到运行时错误时的重试策略的对象数组。 - 分支
-
Choice
状态向状态机添加分支逻辑。Choice ("Type": "Choice"
) 是确定状态机接下来转换到的状态的规则数组。 - 链接
-
“链接”模式描述在状态机中连接在一起的多个 Lambda 函数。您可以使用链接从状态机的 Task (
"Type": "Task"
) 状态创建可重用的工作流调用。 - Parallelism
-
Parallel
状态向状态机添加并行逻辑。您可以使用 Parallel 状态 ("Type": "Parallel"
) 在状态机中创建并行调用分支。 - 动态并行
-
Map
状态向状态机添加动态“for-each”循环逻辑。您可以使用 Map 状态 ("Type": "Map"
) 为状态机中输入数组中的每个元素运行一组步骤。当Parallel
状态使用相同的输入调用多个步骤分支时,Map
状态会为数组中的多个条目调用相同的步骤。
除了应用程序模式外,Step Functions 还支持各种服务集成模式,包括暂停工作流进行人工审批,或调用旧系统或其他第三方。
分支应用程序模式示例
在以下示例中,在 Amazon 状态语言 (ASL) 定义中定义的 WhichCoat
状态机显示了具有 Choice 状态 ("Type": "Choice"
) 的分支应用程序模式。如果满足三个 Choice
状态之一的条件,Lambda 函数将作为 Task(任务)调用:
-
WearHeavyCoat
状态调用wear_heavy_coat
Lambda 函数并返回消息。 -
WearLightJacket
状态调用wear_light_jacket
Lambda 函数并返回消息。 -
None
状态调用no_jacket
Lambda 函数并返回消息。
WhichCoat
状态机具有以下结构:
例 Amazon 状态语言定义示例
WhichCoat
状态机的以下 Amazon 状态语言定义使用名为 Variable
的 Weather
上下文对象。如果满足 StringEquals
中的三个条件之一,则会调用 Resource
字段的 Amazon Resource Name (ARN) 中定义的 Lambda 函数。
{ "Comment":"Coat Indicator State Machine", "StartAt":"WhichCoat", "States":{ "WhichCoat":{ "Type":"Choice", "Choices":[ {
"Variable":"$.Weather",
"StringEquals":"FREEZING",
"Next":"WearHeavyCoat" }, {"Variable":"$.Weather",
"StringEquals":"COOL",
"Next":"WearLightJacket" }, {"Variable":"$.Weather",
"StringEquals":"WARM",
"Next":"None" } ] }, "WearHeavyCoat":{ "Type":"Task","Resource":"arn:aws:lambda:us-west-2:01234567890:function:wear_heavy_coat",
"End":true }, "WearLightJacket":{ "Type":"Task","Resource":"arn:aws:lambda:us-west-2:01234567890:function:wear_light_jacket",
"End":true }, "None":{ "Type":"Task","Resource":"arn:aws:lambda:us-west-2:01234567890:function:no_coat",
"End":true } } }
例 Python 函数示例
可以针对上一个示例中定义的状态机调用 Python (wear_heavy_coat
) 中的以下 Lambda 函数。如果 WhichCoat
状态机等于 FREEZING
字符串值,则从 Lambda 调用 wear_heavy_coat
函数,并且用户会收到与该函数对应的消息:“You should wear a heavy coat today.(您今天应该穿上厚外套。)”
from __future__ import print_function import datetime def wear_heavy_coat(message, context): print(message) response = {} response['Weather'] = message['Weather'] response['Timestamp'] = datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S") response['Message'] = 'You should wear a heavy coat today.' return response
例 调用数据示例
当 Weather
变量等于 FREEZING
字符串值时,以下输入数据会运行调用 wear_heavy_coat
Lambda 函数的 WearHeavyCoat
状态。
{ "Weather":"FREEZING" }
有关更多信息,请参阅 Amazon Step Functions 开发人员指南中的创建使用 Lambda 的 Step Functions 状态机。