状态机应用程序模式 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

状态机应用程序模式

在 Step Functions 中,您可以使用状态机来编排您的资源,状态机使用称为 Amazon 状态语言的基于 JSON 的结构化语言进行定义。

状态机组件

状态机包含称为状态的元素,这些元素将组成工作流。每个状态的逻辑决定下一个状态、要传递的数据以及何时终止工作流。状态通过其名称来引用,其名称可以是任意字符串,但在整个状态机的范围内必须唯一。

要创建使用 Lambda 的状态机,需要以下几个组件:

  1. 适用于 Lambda 的具有一个或多个权限策略(如 AWSLambDarole 服务权限)的 AWS Identity and Access Management (IAM) 角色。

  2. 用于特定运行时的一个或多个 Lambda 函数(附加了 IAM 角色)。

  3. 以 Amazon 状态语言编写的状态机。

状态机应用程序模式

您可以使用应用程序模式为状态机创建复杂的编排,例如:

  • 捕获并重试 – 使用复杂的捕获并重试功能处理错误。

  • 分支 – 将工作流设计为根据 Lambda 函数的输出来选择不同的分支。

  • 链接 – 通过将上一个步骤的输出作为下一个步骤的输入将函数连接为一系列步骤。

  • 并行 – 并行运行函数,或者使用动态并行为任何数组中的每个成员调用函数。

将模式应用到状态机

下面介绍如何将这些应用程序模式应用到 Amazon 状态语言定义中的状态机。

捕获并重试

Catch 字段和 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 调用:

  1. WearHeavyCoat 状态调用 wear_heavy_coat Lambda 函数并返回消息。

  2. WearLightJacket 状态调用 wear_light_jacket Lambda 函数并返回消息。

  3. None 状态调用 no_jacket Lambda 函数并返回消息。

WhichCoat 状态机具有以下结构:

例 Amazon 状态语言定义示例

WhichCoat 状态机的以下 Amazon 状态语言定义使用名为 WeatherVariable 上下文对象。如果满足 StringEquals 中的三个条件之一,则会调用 Resource 字段的 Amazon 资源名称 (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" }

有关更多信息,请参阅 AWS Step Functions 开发人员指南中的创建使用 Lambda 的 Step Functions 状态机