Service Integration Patterns - AWS Step Functions
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

Service Integration Patterns

AWS Step Functions 直接在 Amazon 状态语言 中与服务集成。您可以使用三种服务集成模式来控制这些 AWS 服务:

  • Call a service and let Step Functions progress to the next state immediately after it gets an HTTP response.

  • Call a service and have Step Functions wait for a job to complete.

  • Call a service with a task token and have Step Functions wait until that token is returned with a payload.

这些服务集成模式中的每一个都由您在任务定义"Resource" 字段中创建 URI 的方式控制。

注意

有关为集成服务配置 AWS Identity and Access Management (IAM) 的信息,请参阅IAM Policies for Integrated Services

Request Response

当您在 "Resource" 您的任务状态字符串 only 提供资源, Step Functions 将等待HTTP响应,然后进入下一个状态。 Step Functions 不等待完成工作。

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

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

该示例引用 Amazon SNS 的发布 API。工作流将在调用 Publish API 后进入下一状态。

Run a Job

对于集成服务(如 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-west-2:123456789012:job-definition/testJobDefinition", "JobName": "testJob", "JobQueue": "arn:aws:batch:us-west-2:123456789012:job-queue/testQueue" }, "Next": "NEXT_STATE" }

附加到资源 Amazon 资源名称 (ARN) 的 .sync 部分告诉 Step Functions 等待作业完成。在调用 AWS Batch submitJob 后,工作流程会暂停。作业完成后,Step Functions 将进入下一状态。有关更多信息,请参阅 AWS Batch 示例项目:管理批处理作业(AWS Batch、Amazon SNS)

要查看等待作业完成的集成服务支持的列表 (.sync),请参阅 Step Functions 支持的 AWS 服务集成

注意

使用 .sync.waitForTaskToken模式的服务集成需要其他 IAM 权限。有关更多信息,请参阅IAM Policies for Integrated Services

Wait for a Callback with the Task Token

回调任务提供了一种暂停工作流程,直到返回任务令牌的方法。任务可能需要等待人员批准、与第三方集成或调用旧式系统。对于这样的任务,您可以无限期地暂停 Step Functions,并等待外部流程或工作流完成。对于这些情况,Step Functions 允许您将任务令牌传递给某些集成服务。任务将会暂停,直到它通过 SendTaskSuccessSendTaskFailure 调用接收到该任务令牌。

要查看支持等待任务令牌的集成服务的列表 (.waitForTaskToken),请参阅 Step Functions 支持的 AWS 服务集成

注意

使用 .sync.waitForTaskToken模式的服务集成需要其他 IAM 权限。有关更多信息,请参阅IAM Policies for Integrated Services

Task Token Example

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


                        SQS 任务等待任务令牌返回

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

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

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

完成后,外部服务会调用包含 taskTokenSendTaskSuccessSendTaskFailure。只有这样,工作流程才会继续进入下一个状态。

注意

要避免在流程无法与 SendTaskSuccessSendTaskFailure 一起发送任务令牌时无限期地等待,请参阅Configure a Heartbeat Timeout for a Waiting Task

Get a Token from the Context Object

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

{ "Execution": { "Id": "arn:aws:states:us-east-1:123456789012:execution:stateMachineName:executionName", "Input": { "key": "value" }, "Name": "executionName", "RoleArn": "arn:aws:iam::123456789012: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:us-east-1:123456789012: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-west-2.amazonaws.com/123456789012/myQueue", "MessageBody": { "Message": "Hello from Step Functions!", "TaskToken.$": "$$.Task.Token" } }, "Next": "NEXT_STATE" }

有关上下文对象的更多信息,请参阅本指南中 输入和输出处理 部分中的 Context 对象

Configure a Heartbeat Timeout for a Waiting Task

等待任务令牌的任务将等到执行达到一年服务配额(请参阅 与状态限制相关的配额)。要避免执行卡顿,您可以在状态机定义中配置检测信号超时间隔。使用 HeartbeatSeconds 字段指定超时间隔。

{ "StartAt": "Push based 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 操作之一返回:

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

有关更多信息,请参阅回调任务示例项目:回调模式示例(Amazon SQS、Amazon SNS、Lambda)