

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

# Task 工作流程状态
<a name="state-task"></a>

**管理状态和转换数据**  
了解有关[使用变量在状态之间传递数据](workflow-variables.md)和[使用转换数据](transforming-data.md)的信息 JSONata。

`Task` 状态 (`"Type": "Task"`) 代表状态机执行的一个工作单元。任务通过使用活动或函数、与其他[支持的](supported-services-awssdk.md#supported-services-awssdk-list)活动或 AWS Lambda 函数集成 AWS 服务，或者通过调用 HTTPS API（例如 Stripe）来执行工作。

[Amazon States Language](concepts-amazon-states-language.md) 通过将状态类型设置为 `Task` 并向任务提供活动、Lambda 函数或 HTTPS API 端点的 Amazon 资源名称（ARN）来呈现任务。

**使用 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>:account-id: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:region:account-id:function:HelloFunction:$LATEST"
  },
  "End": true
}
```

## 任务类型
<a name="task-types"></a>

Step Functions 支持以下任务类型，您可以在 Task 状态定义中指定这些类型：
+  [活动](#state-task-activity) 
+  [Lambda 函数](#state-task-lambda) 
+  [A 支持的 AWS 服务](#state-task-connector) 
+ [HTTP 任务](call-https-apis.md)

您可以通过在 Task 状态定义的 `Resource` 字段中提供其 ARN 来指定任务类型。以下示例显示了 `Resource` 字段的语法。除调用 HTTPS API 的任务类型外，所有任务类型均使用以下语法。有关 HTTP 任务语法的信息，请参阅[在 Step Functions 工作流程 APIs 中调用 HT](call-https-apis.md)。

在任务状态定义中，将以下语法中的斜体文本替换为 AWS 资源特定的信息。

```
arn:partition:service:region:account:task_type:name
```

下面的列表解释了此语法中的各个组件：
+  `partition`是最常用的 AWS Step Functions 分区`aws`。
+  `service`表示 AWS 服务 用于执行任务的，可以是以下值之一：
  +  `states` 表示[活动](#state-task-activity)。
  +  `lambda` 表示 [Lambda 函数](#state-task-lambda)。如果您与其他 AWS 服务（例如 Amazon SNS 或 Amazon DynamoDB）集成，请使用或。`sns` `dynamodb`
+  `region`是在其中创建 Step Functions 活动或状态机类型、Lambda 函数或任何其他 AWS 资源的[AWS 区域代码](https://docs.aws.amazon.com/general/latest/gr/rande.html)。
+  `account`是您定义资源时使用的 AWS 账户 ID。
+  `task_type` 是要运行的任务的类型。它可能为下列值之一：
  +  `activity` – 一个[活动](#state-task-activity)。
  +  `function` – 一个 [Lambda 函数](#state-task-lambda)。
  +  `servicename` – 支持的连接服务的名称（请参阅 [将服务与 Step Functions 集成](integrate-optimized.md)）。
+  `name` 是已注册的资源名称（活动名称、Lambda 函数名称或服务 API 操作）。

**注意**  
Step Functions 不支持 ARNs 跨分区或区域进行引用。例如，`aws-cn` 无法调用 `aws` 分区中的任务，反之亦然。

以下各部分提供有关每种类型的更多详细信息。

### Activity
<a name="state-task-activity"></a>

活动表示由您实现和托管的、用于执行某个特定任务的工作线程 (进程或线程)。它们只受标准工作流支持，而不受快速工作流支持。

活动`Resource` ARNs 使用以下语法。

```
arn:partition:states:region:account:activity:name
```

**注意**  
在首次使用 Step Functions（使用[CreateActivity](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateActivity.html)、API 操作或 Step Functions [控制台）之前，您必须使用 Step Fun](https://console.aws.amazon.com/states/home?region=us-east-1#/) ctions 创建活动。

有关创建活动和实现工作线程的更多信息，请参阅[活动](concepts-activities.md)。

### Lambda 函数
<a name="state-task-lambda"></a>

Lambda 任务使用执行函数。 AWS Lambda要指定 Lambda 函数，请在 `Resource` 字段中使用 Lambda 函数的 ARN。

Lambda 函数 `Resource` 字段的形式因集成类型而异。

对于与 Lambda 函数的标准 AWS SDK 集成，该`Resource`字段将包含以下值：

```
"arn:aws:states:::aws-sdk:lambda:invoke"
```

我们**建议**对您的 Lambda 函数使用经过优化的集成，对 `Resource` 字段使用以下值：

```
"arn:aws:states:::lambda:invoke"
```

以下`Task`状态定义显示了与名为 `HelloWorld` using 的 Lambda 函数进行优化集成的示例。 JSONata

```
"Optimized call to Lambda function (JSONata)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Output": "{% $states.result.Payload %}",
      "Arguments": {
        "FunctionName": "arn:aws:lambda:region:account-id:function:HelloWorld:$LATEST",
        "Payload": {
          "key": "{% $states.input.myKey %}"
        }
      },
  "Next": "NextState"
}
```

### A 支持的 AWS 服务
<a name="state-task-connector"></a>

当您引用连接的资源时，Step Functions 直接调用受支持服务的 API 操作。在 `Resource` 字段中指定服务和操作。

连接的服务`Resource` ARNs 使用以下语法。

```
arn:partition:states:region:account-id:servicename:APIname
```

**注意**  
要创建与已连接资源的同步连接，请在 ARN 的*APIname*条目中`.sync`追加该条目。有关更多信息，请参阅 [集成 服务](integrate-services.md)。

例如：

```
{
 "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 状态字段
<a name="task-state-fields"></a>

除了[常见状态字段](statemachine-structure.md#amazon-states-language-common-fields)之外，`Task` 状态还具有以下字段。

** `Resource`（必填）**  
一个 URI，尤其是唯一标识要执行的特定任务的 ARN。

**`Arguments`（ JSONata 仅限可选）**  
用于将信息传递给所连接资源的 API 操作。值可以包括 JSONata 表达式。有关更多信息，请参阅 [在 Step Functi JSONata ons 中使用转换数据](transforming-data.md)。

**`Output`（ JSONata 仅限可选）**  
用于指定和转换状态的输出。指定后，该值将覆盖状态输出默认值。  
输出字段接受任何 JSON 值（对象、数组、字符串、数字、布尔值、null）。任何字符串值，包括对象或数组内部的字符串值，都将被计算为 JSONata 被 \$1%%\$1 个字符包围。  
 输出也直接接受 JSONata 表达式，例如：“输出”：“\$1% jsonata expression%\$1”   
有关更多信息，请参阅[输入和输出处理](concepts-input-output-filtering.md)。

**`Parameters`（ JSONPath 仅限可选）**  
用于将信息传递给所连接资源的 API 操作。这些参数可以混合使用静态 JSON 和[JsonPath](https://datatracker.ietf.org/wg/jsonpath/about/)。有关更多信息，请参阅[在 Step Functions 中将参数传递给服务 API](connect-parameters.md)。

**`Credentials`（可选）**  
指定状态机的执行角色在调用指定 `Resource` 前必须承担的目标角色。或者，您也可以指定一个 JSONPath 值或一个[内部函数](intrinsic-functions.md)，根据执行输入在运行时解析为 IAM 角色 ARN。如果指定一个 JSONPath 值，则必须在其前面加上`$.`符号。  
有关在 `Task` 状态内使用此字段的示例，请参阅 [Task 状态的“凭证”字段示例](#task-state-example-credentials)。有关使用此字段从状态机访问跨账户 AWS 资源的示例，请参阅[在 Step Functi AWS ons 中访问跨账户资源](tutorial-access-cross-acct-resources.md)。  
使用 [Lambda 函数[任务类型](#task-types)](#state-task-lambda)的和支持的服务[支持 AWS](integrate-services.md)此字段。

** `ResultPath`（ JSONPath 仅限可选）**  
指定（输入中）用于放置 `Resource` 中所指定任务的执行结果的位置。接下来，输入将按照 `OutputPath` 字段（如果存在）指定的内容进行筛选，然后再用作状态输出。有关更多信息，请参阅[输入和输出处理](concepts-input-output-filtering.md)。

** `ResultSelector`（ JSONPath 仅限可选）**  
传递键值对集合，其中，值为静态值或从结果中选择的值。有关更多信息，请参阅[ResultSelector](input-output-inputpath-params.md#input-output-resultselector)。

** `Retry`（可选）**  
一个称为重试器的对象的数组，定义在状态遇到运行时错误时的重试策略。有关更多信息，请参阅[使用 Retry 和 Catch 的状态机示例](concepts-error-handling.md#error-handling-examples)。

** `Catch`（可选）**  
一个称为捕获器的对象数组，用于定义回退状态。如果状态遇到运行时错误并且其重试策略已耗尽或者未定义，则执行该状态。有关更多信息，请参阅[回退状态](concepts-error-handling.md#error-handling-fallback-states)。

** `TimeoutSeconds`（可选）**  
指定活动或任务在因 [States.Timeout](concepts-error-handling.md#statestimeout) 错误而超时并失败之前可以运行的最长时间。超时值必须是非零的正整数。默认值为 `99999999`。  
超时计数从启动事件执行时开始，例如，从 `TaskStarted`、`ActivityStarted` 或 `LambdaFunctionStarted` 事件开始在执行事件历史中记录时开始。对于活动，当 `GetActivityTask` 收到令牌并且 `ActivityStarted` 记录在执行事件历史记录中时开始计数。  
Step Functions 会在指定的 `TimeoutSeconds` 时长内等待任务或活动工作线程的成功或失败响应。如果任务或活动工作线程未能在这段时间内做出响应，Step Functions 会将工作流执行标记为失败。  
HTTP 任务超时的最大值为 60 秒，即使 `TimeoutSeconds` 超过该限制也是如此。请参阅 [与 HTTP 任务相关的配额](service-quotas.md#service-limits-http-task)。

** `TimeoutSecondsPath`（ JSONPath 仅限可选）**  
 如果要使用参考路径从状态输入中动态提供超时值，请使用 `TimeoutSecondsPath`。解析后，参考路径必须选择值为正整数的字段。  
一个 `Task` 状态不能同时包含 `TimeoutSeconds` 和 `TimeoutSecondsPath`。HTTP 任务超时的最大值为 60 秒，即使 `TimeoutSecondsPath` 值超过该限制也是如此。

** `HeartbeatSeconds`（可选）**  
确定活动工作线程在任务执行期间发送的检测信号的频率。检测信号表示任务仍在运行，需要更多时间才能完成。检测信号可防止活动或任务在 `TimeoutSeconds` 持续时间内超时。  
`HeartbeatSeconds` 必须是小于 `TimeoutSeconds` 字段值的正非零整数值。默认值为 `99999999`。如果任务检测信号之间的时间超过了指定秒数，则 Task 状态将失败，并返回 [States.Timeout](concepts-error-handling.md#statestimeout) 错误。  
对于活动，当 `GetActivityTask` 收到令牌并且 `ActivityStarted` 记录在执行事件历史记录中时开始计数。

** `HeartbeatSecondsPath`（ JSONPath 仅限可选）**  
如果要使用参考路径从状态输入中动态提供检测信号值，请使用 `HeartbeatSecondsPath`。解析后，参考路径必须选择值为正整数的字段。  
一个 `Task` 状态不能同时包含 `HeartbeatSeconds` 和 `HeartbeatSecondsPath`。

`Task` 状态必须将 `End` 字段设置为 `true`（如果状态结束执行），或者必须在 `Next` 字段中提供一个状态（该状态将在 `Task` 状态完成时运行）。

## Task 状态定义示例
<a name="task-state-example"></a>

以下示例说明如何根据要求指定 Task 状态定义。
+ [指定 Task 状态超时和检测信号间隔](#task-state-example-timeouts)
  + [静态超时和检测信号通知示例](#task-state-example-static)
  + [动态任务超时和检测信号通知示例](#task-state-example-dynamic)
+ [使用“凭证”字段](#task-state-example-credentials)
  + [指定硬编码的 IAM 角色 ARN](#example-credentials-specify-role-arn)
  + [指定 JSONPath 为 IAM 角色 ARN](#example-credentials-specify-dynamic-jsonpath)
  + [指定一个内置函数为 IAM 角色 ARN](#example-credentials-specify-dynamic-intrinsic-function)

### Task 状态超时和检测信号间隔
<a name="task-state-example-timeouts"></a>

为长时间运行的活动设置超时值和检测信号间隔是一个好的做法。这可以通过指定超时和检测信号值或通过动态设置来完成。

#### 静态超时和检测信号通知示例
<a name="task-state-example-static"></a>

当 `HelloWorld` 完成后，将运行下一个状态（此处名为 `NextState`）。

如果此任务在 300 秒内未能完成，或者未在 60 秒的间隔内发送检测信号通知，则任务会被标记为 `failed`。

```
"ActivityState": {
  "Type": "Task",
  "Resource": "arn:aws:states:region:123456789012:activity:HelloWorld",
  "TimeoutSeconds": 300,
  "HeartbeatSeconds": 60,
  "Next": "NextState"
}
```

#### 动态任务超时和检测信号通知示例
<a name="task-state-example-dynamic"></a>

在此示例中，当 AWS Glue 作业完成时，下一个状态将运行。

如果此任务未能在 AWS Glue 作业动态设置的时间间隔内完成，则该任务将被标记为 `failed`。

```
"GlueJobTask": {
  "Type": "Task",
  "Resource": "arn:aws:states:::glue:startJobRun.sync",
  "Parameters": {
    "JobName": "myGlueJob"
  },
  "TimeoutSecondsPath": "$.params.maxTime",
  "Next": "NextState"
}
```

### Task 状态的“凭证”字段示例
<a name="task-state-example-credentials"></a>

#### 指定硬编码的 IAM 角色 ARN
<a name="example-credentials-specify-role-arn"></a>

以下示例指定了一个目标 IAM 角色，状态机的执行角色必须担任该角色才能访问名为 `Echo` 的跨账户 Lambda 函数。在此示例中，目标角色 ARN 被指定为一个硬编码值。

```
{
  "StartAt": "Cross-account call",
  "States": {
    "Cross-account call": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Credentials": {
        "RoleArn": "arn:aws:iam::111122223333:role/LambdaRole"
      },
      "Parameters": {
        "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:Echo"
      },
      "End": true
    }
  }
}
```

#### 指定 JSONPath 为 IAM 角色 ARN
<a name="example-credentials-specify-dynamic-jsonpath"></a>

以下示例指定了一个 JSONPath 值，该值将在运行时解析为 IAM 角色 ARN。

```
{
  "StartAt": "Lambda",
  "States": {
    "Lambda": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Credentials": {
        "RoleArn.$": "$.roleArn"
      },
      ...
    }
  }
}
```

#### 指定一个内置函数为 IAM 角色 ARN
<a name="example-credentials-specify-dynamic-intrinsic-function"></a>

以下示例使用 [`States.Format`](intrinsic-functions.md#asl-intrsc-func-generic) 内置函数，该函数在运行时解析为 IAM 角色 ARN。

```
{
  "StartAt": "Lambda",
  "States": {
    "Lambda": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Credentials": {
        "RoleArn.$": "States.Format('arn:aws:iam::{}:role/ROLENAME', $.accountId)"
      },
      ...
    }
  }
}
```