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

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

服务集成模式

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

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

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

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

这些服务集成模式中的每一种都由您在中创建 URI 的方式来控制"Resource"你的领域任务定义.

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

请求响应

当您在中指定服务时"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:us-east-1:123456789012:myTopic", "Message":"Hello from Step Functions!" }, "Next":"NEXT_STATE" }

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

运行作业 (.sync)

用于集成服务,例如Amazon Batch和 Amazon ECS Step Functions ep Fonctions 可以等待请求完成后再进入下一个状态。要等待 Step Functions,请指定"Resource"任务状态定义中的字段,其中包含.sync在资源 URI 后面添加后缀。

例如,在提交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附加到资源亚马逊资源名称 (ARN) 的部分意味着 Step Functions 等待任务完成。在调用 Amazon Batch submitJob 后,工作流程会暂停。作业完成后,Step Functions 进入下一个状态。有关更多信息,请参阅 Amazon Batch 示例项目:管理 Batch 理 Job (Amazon Batch、Amazon SNS)

如果任务使用这个 (.sync) 服务集成模式已中止,并且 Step Functions 无法取消任务,您可能会从集成服务中产生额外费用。在以下情况下可以中止任务:

  • 状态机执行已停止。

  • 并行状态的另一个分支出现故障,出现未捕获的错误。

  • 映射状态的迭代失败并出现未捕获的错误。

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

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

  • 服务暂时中断。

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

注意

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

等待具有任务令牌的回调

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

如果 aTask状态使用回调任务令牌超时,会生成一个新的随机令牌。您可以通过以下方式访问任务令牌Contex.

注意

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

要使用.waitForTaskToken用AmazonSDK 集成,您使用的 API 必须有一个参数字段,用于放置任务令牌。

注意

你必须在同一范围内传递委托人的任务令牌Amazon账户。如果你用其他方式从校长那里发送代币,这些代币将不起作用Amazon账户。

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

任务令牌示例

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


            SQS 任务等待任务令牌返回

这些区域有:"Resource"引用 Amazon SQS 的任务定义字段包括.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" 字段中访问任务令牌。初始 $$. 指定访问上下文对象的路径,并在正在运行的执行中获取当前任务的任务令牌。

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

注意

要避免在流程无法与 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)