服务集成模式 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

服务集成模式

Amazon Step FunctionsAmazon 状态可直接与以循。您可以使用三种服务集成模式来控制这些 Amazon 服务:

  • 调用服务,让 Step Functions 在获得 HTTP 响应后立即进入下一个状态。

  • 调用服务,让 Step Functions 等待任务完成。

  • 使用任务令牌调用服务,让 Step Functions 等到该令牌与有效负载一起返回。

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

有关为集成服务配置Amazon Identity and Access Management (IAM) 的信息,请参阅集成服务的 IAM 政策

请求响应

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

以下示例显示如何发布Amazon SS 主题的Amazon SNS 主题的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 后进入下一状态。

提示

要向您部署使用请求响应服务集成模式的示例工作流程Amazon Web Services 账户,请参阅Amazon Step Functions研讨会模块 2-请求响应

运行作业 (.sync)

对于Amazon Batch和 Amazon ECS 等集成服务,Step Functions 可以等待请求完成,然后再进入下一个状态。要让 Step Functions 等待,请在任务状态定义中指定"Resource"字段,并在资源 URI 后面附加后.sync缀。

例如,在提交Amazon 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 等待任务完成。在调用 Amazon Batch submitJob 后,工作流程会暂停。作业完成后,Step Functions 将进入下一个状态。有关更多信息,请参阅 Amazon Batch 示例项目:管理 Batch 理 Job (Amazon Batch、Amazon SNS)

如果使用此 (.sync) 服务集成模式的任务中止,且 Step Functions 无法取消该任务,则集成服务可能会向您收取额外费用。在以下情况下,任务可以中止:

  • 状态机执行已停止。

  • 并行状态的另一个分支失败并出现未发现的错误。

  • 地图状态的迭代失败并出现未发现的错误。

Step Functions 将尽最大努力取消任务。例如,如果某个 Step Functistates:startExecution.sync ons 任务被中止,它将调用 Step FunctionStopExecution s API 操作。但是,Step Functions 可能无法取消任务。其原因包括但不限于:

  • 您的 IAM 执行角色没有权限进行相应的 API 调用。

  • 发生了临时服务中断。

当您使用.sync服务集成模式时,Step Functions 使用轮询来消耗分配的配额和事件来监控作业的状态。对于同一账户内的.sync调用,Step Functions 使用 EventBridge 事件并轮询您在Task状态中指定的 API。对于跨账户.sync调用,Step Functions 仅使用轮询。例如states:StartExecution.sync,对于,Step Functions 在 DescribeExecutionAPI 上执行轮询并使用您分配的配额。

提示

要将使用 Run a Job (.sync) 服务集成模式的示例工作流程部署到您Amazon Web Services 账户,请参阅 The Workshop 的模块 3-运行Job (.sync)。Amazon Step Functions

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

注意

使用该.sync模式的服务集成需要额外的 IAM 权限。有关更多信息,请参阅集成服务的 IAM 政策

等待具有任务令牌的回调

回调任务提供了一种暂停工作流程,直到返回任务令牌的方法。任务可能需要等待人员批准、与第三方集成或调用旧式系统。对于此类任务,您可以暂停 Step Functions,直到工作流程执行达到一年的服务配额(参见,与州限制相关的配额),然后等待外部流程或工作流完成。对于这些情况,Step Functions 允许您将任务令牌传递给Amazon SDK 服务集成以及某些优化的服务集成。任务将会暂停,直到它通过 SendTaskSuccessSendTaskFailure 调用接收到该任务令牌。

如果使用回调任务令牌的Task状态超时,则会生成一个新的随机标记。您可以从上下文对象访问任务令牌。

注意

任务必须包含至循 1 个字符 1 个字符 1 个字符 1 个字符 1 个字符 1 个字符 1 个字符

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

注意

您必须在同一Amazon账户中传递来自委托人的任务代币。如果您从其他Amazon账户的委托人那里发送代币,这些代币将不起作用。

提示

要向您部署使用回调任务令牌服务集成模式的示例工作流程Amazon Web Services 账户,请参阅模块 4-使用Amazon Step Functions研讨会任务令牌等待回调

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

任务令牌示例

在此示例中,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-east-2.amazonaws.com/123456789012/myQueue", "MessageBody": { "Message": "Hello from Step Functions!", "TaskToken.$": "$$.Task.Token" } }, "Next": "NEXT_STATE" }

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

完成后,外部服务将调SendTaskFailureSendTaskSuccess或随taskToken附的。只有这样,工作流程才会继续进入下一个状态。

注意

要避免在流程无法与 SendTaskSuccessSendTaskFailure 一起发送任务令牌时无限期地等待,请参阅为等待任务配置检测信号超时

从上下文对象获取令牌

上下文对象是一个内部 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 示例.waitForTaskToken中,在"Resource"字段中指示 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" }

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

为等待任务配置检测信号超时

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

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

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

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