

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

# 探索 Step Functions 中的服务集成模式
<a name="connect-to-resource"></a>

对于服务集成，您可以指定各种集成模式来控制状态机与 AWS 集成服务的交互方式：
+ [请求响应](#connect-default) - 调用服务，Step Functions 将在获得 HTTP 响应后立即进入下一个状态。
+ [运行作业 (.sync)](#connect-sync) - 调用服务，并让 Step Functions 等待作业完成。
+ [等待具有任务令牌的回调](#connect-wait-token) - 使用任务令牌调用服务并让 Step Functions 等待，直到该令牌与有效载荷一起返回。

上述每种服务集成模式都受控于在[任务定义](state-task.md)的 `"Resource"` 字段中创建 URI 的方式。

Step Functions 中的 ASL 资源值是一个唯一的名称（URI），它符合 [ARN 格式](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html#arns-syntax)，但通常无法识别账户中的实际资源**。前缀“`arn:aws:states:`”设置 Step Functions 用于集成的命名空间。该值的 `:::` 部分表示空白 `region` 和 `account-id` 字段是不必要的，因为两者都是从运行工作流的区域和账户推断出来的。

传统集成 AWS Lambda 是唯一的例外，其中资源值指定了实际的 Lambda 函数资源。Step Functions 控制台将显示这些旧版资源，但除非您选择直接编辑 ASL 代码，否则将无法在当今的图形用户界面中创建或编辑此类资源。

## 集成模式支持
<a name="connect-to-services-integration-patterns"></a>

标准工作流程和快速工作流程支持相同的**集成**，但支持的**集成模式**不同。
+  **标准工作流程**支持*请求响应* 集成。某些服务支持 *Run a Job (.sync)* 或*等待回调 (. waitForTask代币）*，在某些情况下两者兼而有之。有关详细信息，请参阅以下优化集成表。
+  **快速工作流程**仅支持*请求响应* 集成。

 为协助在两种类型之间做出选择，请参阅[在 Step Functions 中选择工作流程类型](choosing-workflow-type.md)。



**AWS Step Functions 中的 SDK 集成**


| 集成 服务 | 请求响应 | 运行任务：*.sync* | 等待回电-*. waitForTask代币* | 
| --- | --- | --- | --- | 
| [超过两百项服务](supported-services-awssdk.md#supported-services-awssdk-list) | 标准和快速 | 不支持 | 标准 | 

**Step Functions 中的优化集成**


| 集成 服务 | 请求响应 | 运行任务：*.sync* | 等待回电-*. waitForTask代币* | 
| --- | --- | --- | --- | 
| [Amazon API Gateway](connect-api-gateway.md) | 标准和快速 | 不支持 | 标准 | 
| [Amazon Athena](connect-athena.md) | 标准和快速 | 标准 | 不支持 | 
| [AWS Batch](connect-batch.md) | 标准和快速 | 标准 | 不支持 | 
| [Amazon Bedrock](connect-bedrock.md) | 标准和快速 | 标准 | 标准 | 
| [AWS CodeBuild](connect-codebuild.md) | 标准和快速 | 标准 | 不支持 | 
| [Amazon DynamoDB](connect-ddb.md) | 标准和快速 | 不支持 | 不支持 | 
| [Amazon ECS/Fargate](connect-ecs.md) | 标准和快速 | 标准 | 标准 | 
| [Amazon EKS](connect-eks.md) | 标准和快速 | 标准 | 标准 | 
| [Amazon EMR](connect-emr.md) | 标准和快速 | 标准 | 不支持 | 
| [Amazon EMR on EKS](connect-emr-eks.md) | 标准和快速 | 标准 | 不支持 | 
| [Amazon EMR Serverless](connect-emr-serverless.md) | 标准和快速 | 标准 | 不支持 | 
| [Amazon EventBridge](connect-eventbridge.md) | 标准和快速 | 不支持 | 标准 | 
| [AWS Glue](connect-glue.md) | 标准和快速 | 标准 | 不支持 | 
| [AWS Glue DataBrew](connect-databrew.md) | 标准和快速 | 标准 | 不支持 | 
| [AWS Lambda](connect-lambda.md) | 标准和快速 | 不支持 | 标准 | 
| [AWS Elemental MediaConvert](connect-mediaconvert.md) | 标准和快速 | 标准 | 不支持 | 
| [Amazon SageMaker AI](connect-sagemaker.md) | 标准和快速 | 标准 | 不支持 | 
| [Amazon SNS](connect-sns.md) | 标准和快速 | 不支持 | 标准 | 
| [Amazon SQS](connect-sqs.md) | 标准和快速 | 不支持 | 标准 | 
| [AWS Step Functions](connect-stepfunctions.md) | 标准和快速 | 标准 | 标准 | 

## 请求响应
<a name="connect-default"></a>

在任务状态的 `"Resource"` 字符串中指定服务，并且*只*提供资源时，Step Functions 将等待 HTTP 响应，然后进入下一个状态。Step Functions 不会等待作业完成。

以下示例显示了如何发布 Amazon SNS 主题。

```
"Send message to SNS": {
    "Type":"Task",
    "Resource":"arn:aws:states:::sns:publish",
    "Parameters": {
        "TopicArn":"arn:aws:sns:region:123456789012:myTopic",
        "Message":"Hello from Step Functions!"
    },
    "Next":"NEXT_STATE"
}
```

此示例引用了 Amazon SNS 的 [Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) API。调用 `Publish` API 后，工作流进入下一状态

**提示**  
要部署使用请求响应服务集成模式的示例工作流程，请参阅本指南入门教程中的[集成服务](getting-started.md#step-4-integrate-a-service)，或* AWS Step Functions 研讨会的 “[请求响应” 模块](https://catalog.workshops.aws/stepfunctions/integrating-services/1-request-response)中的*集成服务。

## 运行作业 (.sync)
<a name="connect-sync"></a>

对于诸如 AWS Batch 和 Amazon ECS 之类的集成服务，Step Functions 可以等待请求完成后再进入下一个状态。要让 Step Functions 等待，请使用在资源 URI 之后附加的 `.sync` 后缀，在任务状态定义中指定 `"Resource"` 字段。

例如，提交 AWS Batch 作业时，使用状态机定义中的`"Resource"`字段，如本示例所示。

```
"Manage Batch task": {
    "Type": "Task",
    "Resource": "arn:aws:states:::batch:submitJob.sync",
    "Parameters": {
        "JobDefinition": "arn:aws:batch:us-east-2:123456789012:job-definition/testJobDefinition",
        "JobName": "testJob",
        "JobQueue": "arn:aws:batch:us-east-2:123456789012:job-queue/testQueue"
    },
    "Next": "NEXT_STATE"
}
```

将 `.sync` 部分附加到资源 Amazon 资源名称 (ARN) 上意味着 Step Functions 会等待作业完成。在调用 AWS Batch `submitJob` 后，工作流会暂停。作业完成后，Step Functions 将进入下一状态。欲了解更多信息，请参阅 AWS Batch 示例项目：[使用 AWS Batch 和 Amazon SNS 管理批处理任务](batch-job-notification.md)。

如果使用此 (`.sync`) 服务集成模式的任务中止，并且 Step Functions 无法取消该任务，则集成服务可能会向您收取额外费用。在以下情况下，任务可能被中止：
+ 状态机执行被停止。
+ 并行状态的另一个分支因未捕获的错误而失败。
+ Map 状态的一次迭代失败并出现未捕获的错误。

Step Functions 将尽力尝试取消任务。例如，如果 Step Functions `states:startExecution.sync` 任务中止，它将调用 Step Functions `StopExecution` API 操作。但是，Step Functions 可能无法取消该任务。原因包括但不限于：
+ 您的 IAM 执行角色没有权限进行相应的 API 调用。
+ 发生临时服务中断。

当您使用 `.sync` 服务集成模式时，Step Functions 会使用轮询来监控任务的状态，并且会消耗分配的配额和事件。对于同一账户内的`.sync`调用，Step Functions 使用 EventBridge 事件并轮询您在状态中`Task`指定的事件。 APIs 对于[跨账户](concepts-access-cross-acct-resources.md)的 `.sync` 调用，Step Functions 仅使用轮询。例如，对于`states:StartExecution.sync`，Step Functions 对 [DescribeExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeExecution.html)API 执行轮询并使用您分配的配额。

**提示**  
*要部署使用.sync 集成模式的示例工作流程，请参阅研讨会中的 [Run a Job (.sync)](https://catalog.workshops.aws/stepfunctions/integrating-services/2-sync-job)。 AWS Step Functions *

要查看等待作业完成的集成服务支持的列表 (`.sync`)，请参阅 [将服务与 Step Functions 集成](integrate-optimized.md)。

**注意**  
使用 `.sync` 或 `.waitForTaskToken` 模式的服务集成需要额外的 IAM 权限。有关更多信息，请参阅 [Step Functions 如何为集成服务生成 IAM 策略](service-integration-iam-templates.md)。

在某些情况下，您可能希望 Step Functions 在任务完全完成之前继续工作流。实现的方法与[等待具有任务令牌的回调](#connect-wait-token)服务集成模式相同。为此，请将任务令牌传递给作业，然后使用 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html) 或 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html) API 调用将其返回。Step Functions 会使用您在该调用中提供的数据来完成任务、停止监控作业并继续工作流。

## 等待具有任务令牌的回调
<a name="connect-wait-token"></a>

回调任务提供了一种暂停工作流程，直到返回任务令牌的方法。任务可能需要等待人员批准、与第三方集成或调用旧式系统。对于此类任务，您可以暂停 Step Functions，直到工作流执行达到一年的服务限额（参阅[与状态限制相关的配额](service-quotas.md#service-limits-api-state-throttling)），然后等待外部流程或工作流完成。对于这些情况，Step Functions 允许您将任务令牌传递给 AWS SDK 服务集成以及某些经过优化的服务集成。任务将会暂停，直到它通过 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html) 或 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html) 调用接收到该任务令牌。

如果使用回调任务令牌的 `Task` 状态超时，则会生成一个新的随机令牌。您可以从[上下文对象](input-output-contextobject.md#contextobject-access)访问任务令牌。

**注意**  
任务令牌必须包含至少 1 个字符，并且不能超过 1024 个字符。

要`.waitForTaskToken`与 S AWS DK 集成一起使用，您使用的 API 必须具有用于放置任务令牌的参数字段。

**注意**  
您必须从同一 AWS 账户中的委托人那里传递任务代币。如果您使用其他 AWS 账户的委托人发送代币，则代币将无法使用。

**提示**  
要部署使用回调任务令牌集成模式的示例工作流程，请参阅 The Worksho * AWS Step Functions p 中的带任务令牌的*[回调](https://catalog.workshops.aws/stepfunctions/integrating-services/3-callback-token)。

要查看支持等待任务令牌的集成服务的列表 (`.waitForTaskToken`)，请参阅 [将服务与 Step Functions 集成](integrate-optimized.md)。

**Topics**
+ [任务令牌示例](#connect-wait-example)
+ [从上下文对象获取令牌](#wait-token-contextobject)
+ [为等待任务配置检测信号超时](#wait-token-hearbeat)

### 任务令牌示例
<a name="connect-wait-example"></a>

在此示例中，Step Functions 工作流需要与外部微服务集成，才能在批准工作流中执行信用检查。Step Functions 会发布一条 Amazon SQS 消息，该消息中包含任务令牌。外部系统与 Amazon SQS 集成，并将消息从队列中拉出。完成后，它将返回结果和原始任务令牌。然后 Step Functions 继续其工作流。

![\[SQS 任务等待任务令牌返回\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/wait-for-task-token.png)


引用 Amazon SQS 的任务定义的 `"Resource"` 字段包括附加到末尾的 `.waitForTaskToken`。

```
"Send message to SQS": {
    "Type": "Task",
    "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
    "Parameters": {
        "QueueUrl": "https://sqs.us-east-2.amazonaws.com/123456789012/myQueue",
        "MessageBody": {
            "Message": "Hello from Step Functions!",
            "TaskToken.$": "$$.Task.Token"
        }
    },
    "Next": "NEXT_STATE"
}
```

这会指示 Step Functions 暂停并等待任务令牌。使用 `.waitForTaskToken` 指定资源时，可以使用特殊路径名称 (`$$.Task.Token`) 在状态定义的 `"Parameters"` 字段中访问任务令牌。初始 `$$.` 指定访问[上下文对象](#wait-token-contextobject)的路径，并在正在运行的执行中获取当前任务的任务令牌。

完成后，外部服务会调用 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html) 或 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html)，其中包含 `taskToken`。只有这样，工作流程才会继续进入下一个状态。

**注意**  
要避免在流程无法与 `SendTaskSuccess` 或 `SendTaskFailure` 一起发送任务令牌时无限期地等待，请参阅[为等待任务配置检测信号超时](#wait-token-hearbeat)。

### 从上下文对象获取令牌
<a name="wait-token-contextobject"></a>

上下文对象是一个内部 JSON 对象，其中包含有关执行的信息。与状态输入一样，可以在执行期间使用来自 `"Parameters"` 字段的路径访问它。从任务定义中访问时，它包含有关特定执行的信息（包括任务令牌）。

```
{
    "Execution": {
        "Id": "arn:aws:states:region:account-id:execution:stateMachineName:executionName",
        "Input": {
            "key": "value"
        },
        "Name": "executionName",
        "RoleArn": "arn:aws:iam::account-id:role...",
        "StartTime": "2019-03-26T20:14:13.192Z"
    },
    "State": {
        "EnteredTime": "2019-03-26T20:14:13.192Z",
        "Name": "Test",
        "RetryCount": 3
    },
    "StateMachine": {
        "Id": "arn:aws:states:region:account-id:stateMachine:stateMachineName",
        "Name": "name"
    },
    "Task": {
        "Token": "h7XRiCdLtd/83p1E0dMccoxlzFhglsdkzpK9mBVKZsp7d9yrT1W"
    }
}
```

您可以使用任务定义的 `"Parameters"` 字段内的特殊路径来访问任务令牌。要访问输入或上下文对象，首先通过将 `.$` 附加到参数名称来指定参数将是路径。以下内容指定 `"Parameters"` 规范中输入和上下文对象的节点。

```
"Parameters": {
    "Input.$": "$",
    "TaskToken.$": "$$.Task.Token"
},
```

在这两种情况下，将 `.$` 添加到参数名称会告知 Step Functions 期望一个路径。在第一种情况下，`"$"` 是一个路径，其中包含整个输入。在第二种情况下，`$$.` 指定路径将访问上下文对象，`$$.Task.Token` 将参数设置为正在运行的执行的上下文对象中的任务令牌的值。

在 Amazon SQS 示例中，`"Resource"` 字段中的 `.waitForTaskToken` 告诉 Step Functions 等待任务令牌返回。`"TaskToken.$": "$$.Task.Token"` 参数将该令牌作为 Amazon SQS 消息的一部分传递。

```
"Send message to SQS": {
    "Type": "Task",
    "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
    "Parameters": {
        "QueueUrl": "https://sqs.us-east-2.amazonaws.com/123456789012/myQueue",
        "MessageBody": {
            "Message": "Hello from Step Functions!",
            "TaskToken.$": "$$.Task.Token"
        }
    },
    "Next": "NEXT_STATE"
}
```

有关上下文对象的更多信息，请参阅本指南[在 Step Functions 中从上下文对象访问执行数据](input-output-contextobject.md)部分中的[处理输入和输出](concepts-input-output-filtering.md)。

### 为等待任务配置检测信号超时
<a name="wait-token-hearbeat"></a>

等待任务令牌的任务将等到执行达到一年服务配额（请参阅 [与状态限制相关的配额](service-quotas.md#service-limits-api-state-throttling)）。要避免执行卡顿，您可以在状态机定义中配置检测信号超时间隔。使用 [`HeartbeatSeconds`](state-task.md) 字段指定超时间隔。

```
{
    "StartAt": "Push to SQS",
        "States": {
        "Push to SQS": {
            "Type": "Task",
                "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
                    "HeartbeatSeconds": 600,
            "Parameters": {
                "MessageBody": { "myTaskToken.$": "$$.Task.Token" },
                "QueueUrl": "https://sqs.us-east-1.amazonaws.com/123456789012/push-based-queue"
            },
            "ResultPath": "$.SQS",
                "End": true
        }
    }
}
```

在此状态机定义中，任务将消息推送到 Amazon SQS 并等待外部进程使用提供的任务令牌进行回调。`"HeartbeatSeconds": 600` 字段将检测信号超时间隔为 10 分钟。该任务将等待任务令牌通过以下 API 操作之一返回：
+ [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html) 
+ [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html)
+ [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskHeartbeat.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskHeartbeat.html)

如果等待任务在该 10 分钟内未收到有效的任务令牌，则任务失败并显示 `States.Timeout` 错误名称。

有关更多信息，请参阅回调任务示例项目：[使用 Amazon SQS、Amazon SNS 和 Lambda 创建回调模式示例](callback-task-sample-sqs.md)。