本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Task 工作流程状态
管理状态和转换数据
Step Functions 最近添加了变量JSONata,用于管理状态和转换数据。
了解如何使用变量传递数据和使用转换数据JSONata。
Task
状态 ("Type": "Task"
) 代表状态机执行的一个工作单元。任务通过使用活动或函数、与其他支持的活动或 Amazon Lambda 函数集成 Amazon Web Services 服务,或者通过调用(例如 Stripe)来执行工作。HTTPS API
Amazon States 语言通过将状态类型设置为Task
并向任务提供活动的亚马逊资源名称 (ARN)、Lambda 函数或终端节点来表示任务。HTTPS API
使用JSONata参数调用函数
以下任务状态定义 (JSONata) 调用名为的 Lambda 函数。priceWatcher
请注意使用JSONata表达式来查询要在 Arguments 中使用的输入数据,以及分配字段中的任务结果。
"Get Current Price": {
"Type": "Task",
"QueryLanguage" : "JSONata",
"Resource": "arn:aws:states:::lambda:invoke",
"Next": "Check Price",
"Arguments": {
"Payload": {
"product": "{% $states.context.Execution.Input.product %}"
},
"FunctionName": "arn:aws:lambda:<region>:123456789012:function:priceWatcher:$LATEST"
},
"Assign": {
"currentPrice": "{% $states.result.Payload.current_price %}"
}
}
使用JSONPath参数调用函数
以下任务状态定义 (JSONPath) 调用名为的 Lambda 函数。HelloFunction
"Lambda Invoke": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:us-east-2
:123456789012
:function:HelloFunction
:$LATEST"
},
"End": true
}
任务类型
Step Functions 支持以下任务类型,您可以在 Task 状态定义中指定这些类型:
您可以通过在任务状态定义的Resource
字段ARN中提供任务类型来指定任务类型。以下示例显示了 Resource
字段的语法。除调用的任务类型外,所有任务类型均HTTPSAPI使用以下语法。有关HTTP任务语法的信息,请参见调用 Step HTTPS APIs Functions 工作流程。
在任务状态定义中,将以下语法中的斜体文本替换为 Amazon 资源特定的信息。
arn:partition
:service
:region
:account
:task_type
:name
下面的列表解释了此语法中的各个组件:
-
partition
是最常用的 Amazon Step Functions 分区aws
。 -
service
表示 Amazon Web Services 服务 用于执行任务的,可以是以下值之一: -
region
是在其中创建 Step Functions 活动或状态机类型、Lambda 函数或任何其他 Amazon 资源的Amazon 区域代码。 -
account
是您定义资源时使用的 Amazon Web Services 账户 ID。 -
task_type
是要运行的任务的类型。它可能为下列值之一:-
activity
– 一个活动。 -
function
– 一个 Lambda 函数。 -
– 支持的连接服务的名称(请参阅 将服务与 Step Functions 集成)。servicename
-
-
name
是注册的资源名称(活动名称、Lambda 函数名称或服务API操作)。
注意
Step Functions 不支持ARNs跨分区或区域进行引用。例如,aws-cn
无法调用 aws
分区中的任务,反之亦然。
以下各部分提供有关每种类型的更多详细信息。
活动
活动表示由您实现和托管的、用于执行某个特定任务的工作线程 (进程或线程)。它们只受标准工作流支持,而不受快速工作流支持。
活动Resource
ARNs使用以下语法。
arn:partition
:states:region
:account
:activity:name
注意
在首次使用 Step Functions(使用CreateActivity、API操作或 Step Functions 控制台
有关创建活动和实现工作线程的更多信息,请参阅活动。
Lambda 函数
Lambda 任务使用执行函数。 Amazon Lambda要指定 Lambda 函数,请使用字段中的 ARN Lambda 函数。Resource
根据您用于指定 Lambda 函数的Amazon SDK集成类型(优化集成或集成),Lambda 函数字段的语法会有所不同。Resource
以下 Resource
字段语法是 Lambda 函数的优化集成的示例。
"arn:aws:states:::lambda:invoke"
以下Resource
字段语法是与 Lambda 函数 Amazon SDK集成的示例。
"arn:aws:states:::aws-sdk:lambda:invoke"
以下 Task
状态定义显示了名为
的 Lambda 函数的优化集成的示例。HelloWorld
"LambdaState": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:us-east-1:function:HelloWorld:$LATEST
"
},
"Next": "NextState"
}
在Resource
字段中指定的 Lambda 函数完成后,其输出将发送到Next
字段中标识的状态 (” NextState “)。
A 支持的 Amazon Web Services 服务
当您引用连接的资源时,Step Functions 会直接调用受支持服务的API操作。在 Resource
字段中指定服务和操作。
连接的服务Resource
ARNs使用以下语法。
arn:partition
:states:region
:account
:servicename
:APIname
注意
要创建与已连接资源的同步连接,请将附加.sync
到中的APIname
条目中。ARN有关更多信息,请参阅 集成 服务。
例如:
{
"StartAt": "BATCH_JOB",
"States": {
"BATCH_JOB": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "preprocessing",
"JobName": "PreprocessingBatchJob",
"JobQueue": "SecondaryQueue",
"Parameters.$": "$.batchjob.parameters",
"RetryStrategy": {
"attempts": 5
}
},
"End": true
}
}
}
Task 状态字段
除了常见状态字段之外,Task
状态还具有以下字段。
-
Resource
(必需) -
AURI,尤其是ARN唯一标识要执行的特定任务的。
Arguments
(JSONata仅限可选)-
用于将信息传递给已连接资源的API操作。值可以包括JSONata表达式。有关更多信息,请参阅 在 Step Functi JSONata ons 中使用转换数据。
Output
(JSONata仅限可选)-
用于指定和转换状态的输出。指定后,该值将覆盖状态输出默认值。
输出字段接受任何JSON值(对象、数组、字符串、数字、布尔值、空)。任何字符串值,包括对象或数组内部的字符串值,都将被计算为JSONata被 {%%} 个字符包围。
输出也直接接受JSONata表达式,例如:“输出”:“{% jsonata expression%}”
有关更多信息,请参阅输入和输出处理。
Parameters
(JSONPath仅限可选)-
用于将信息传递给已连接资源的API操作。这些参数可以混合使用静态JSON和JsonPath
。有关更多信息,请参阅 在 Step Functions API 中向服务传递参数。 Credentials
(可选)-
指定状态机的执行角色在调用指定
Resource
前必须承担的目标角色。或者,您也可以指定一个JSONPath值或一个内部函数,该值或一个内部函数,该函数根据执行输入ARN在运行时解析为IAM角色。如果指定一个JSONPath值,则必须在其前面加上$.
符号。有关在
Task
状态内使用此字段的示例,请参阅 。有关使用此字段从状态机访问跨账户 Amazon 资源的示例,请参阅在 Step Functions 中访问跨账户 Amazon 资源。注意
使用 Lambda 函数任务类型的和支持的服务支持 Amazon此字段。
-
ResultPath
(JSONPath仅限可选) -
指定(输入中)用于放置
Resource
中所指定任务的执行结果的位置。接下来,输入将按照OutputPath
字段(如果存在)指定的内容进行筛选,然后再用作状态输出。有关更多信息,请参阅输入和输出处理。 -
ResultSelector
(JSONPath仅限可选) -
传递键值对集合,其中,值为静态值或从结果中选择的值。有关更多信息,请参阅 ResultSelector。
-
Retry
(可选) -
一个称为重试器的对象的数组,定义在状态遇到运行时错误时的重试策略。有关更多信息,请参阅 使用 Retry 和使用 Catch 的状态机示例。
-
Catch
(可选) -
一个称为捕获器的对象数组,用于定义回退状态。如果状态遇到运行时错误并且其重试策略已耗尽或者未定义,则执行该状态。有关更多信息,请参阅回退状态。
-
TimeoutSeconds
(可选) -
指定活动或任务在因 States.Timeout 错误而超时并失败之前可以运行的最长时间。超时值必须是非零的正整数。默认值为
99999999
。超时计数从任务启动后开始,例如,从
ActivityStarted
或LambdaFunctionStarted
事件记录到执行事件历史记录时开始。对于活动,当GetActivityTask
收到令牌并且ActivityStarted
记录在执行事件历史记录中时开始计数。Step Functions 会在指定的
TimeoutSeconds
时长内等待任务或活动工作线程的成功或失败响应。如果任务或活动工作线程未能在这段时间内做出响应,Step Functions 会将工作流执行标记为失败。注意
HTTP任务超时的最大值为 60 秒,即使
TimeoutSeconds
超过该限制也是如此。请参阅 与HTTP任务相关的配额。 -
TimeoutSecondsPath
(JSONPath仅限可选) -
如果要使用参考路径从状态输入中动态提供超时值,请使用
TimeoutSecondsPath
。解析后,参考路径必须选择值为正整数的字段。注意
一个
Task
状态不能同时包含TimeoutSeconds
和TimeoutSecondsPath
。 HTTP任务超时的最大值为 60 秒,即使该TimeoutSecondsPath
值超过该限制也是如此。 -
HeartbeatSeconds
(可选) -
确定活动工作线程在任务执行期间发送的检测信号的频率。检测信号表示任务仍在运行,需要更多时间才能完成。检测信号可防止活动或任务在
TimeoutSeconds
持续时间内超时。HeartbeatSeconds
必须是小于TimeoutSeconds
字段值的正非零整数值。默认值为99999999
。如果任务检测信号之间的时间超过了指定秒数,则 Task 状态将失败,并返回 States.Timeout 错误。对于活动,当
GetActivityTask
收到令牌并且ActivityStarted
记录在执行事件历史记录中时开始计数。 -
HeartbeatSecondsPath
(JSONPath仅限可选) -
如果要使用参考路径从状态输入中动态提供检测信号值,请使用
HeartbeatSecondsPath
。解析后,参考路径必须选择值为正整数的字段。注意
一个
Task
状态不能同时包含HeartbeatSeconds
和HeartbeatSecondsPath
。
Task
状态必须将 End
字段设置为 true
(如果状态结束执行),或者必须在 Next
字段中提供一个状态(该状态将在 Task
状态完成时运行)。
Task 状态定义示例
以下示例说明如何根据要求指定 Task 状态定义。
Task 状态超时和检测信号间隔
为长时间运行的活动设置超时值和检测信号间隔是一个好的做法。这可以通过指定超时和检测信号值或通过动态设置来完成。
静态超时和检测信号通知示例
当 HelloWorld
完成后,将运行下一个状态(此处名为 NextState
)。
如果此任务在 300 秒内未能完成,或者未在 60 秒的间隔内发送检测信号通知,则任务会被标记为 failed
。
"ActivityState": {
"Type": "Task",
"Resource": "arn:aws:states:us-east-1:123456789012:activity:HelloWorld",
"TimeoutSeconds": 300,
"HeartbeatSeconds": 60,
"Next": "NextState"
}
动态任务超时和检测信号通知示例
在此示例中,当 Amazon Glue 作业完成时,下一个状态将运行。
如果此任务未能在 Amazon Glue
作业动态设置的时间间隔内完成,则该任务将被标记为 failed
。
"GlueJobTask": {
"Type": "Task",
"Resource": "arn:aws:states:::glue:startJobRun.sync",
"Parameters": {
"JobName": "myGlueJob"
},
"TimeoutSecondsPath": "$.params.maxTime",
"Next": "NextState"
}