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

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

Context 对象

上下文对象是执行期间可用的内部 JSON 结构,包含有关状态机和执行的信息。这允许您的工作流访问有关其特定执行的信息。您可以从以下字段访问上下文对象:

  • InputPath

  • OutputPath

  • ItemsPath(在 Map 状态下)

  • Variable(在 Choice 状态下)

  • ResultSelector

  • Parameters

  • 变量到变量的比较运算符

上下文对象格式

上下文对象包括有关状态机、状态、执行和任务的信息。此 JSON 对象包括每种类型数据的节点,并采用以下格式。

{ "Execution": { "Id": "String", "Input": {}, "Name": "String", "RoleArn": "String", "StartTime": "Format: ISO 8601", "RedriveCount": Number, "RedriveTime": "Format: ISO 8601" }, "State": { "EnteredTime": "Format: ISO 8601", "Name": "String", "RetryCount": Number }, "StateMachine": { "Id": "String", "Name": "String" }, "Task": { "Token": "String" } }

在执行期间,上下文对象将以访问它的 Parameters 字段的相关数据填充。如果 Parameters 字段超出任务状态,则 Task 字段的值为空。

如果您尚未redriven执行,则 RedriveCount 上下文对象的值为 0。此外,RedriveTime 上下文对象只有在redriven执行时才可用。如果您已redriven a Map Run,则 RedriveTime 上下文对象仅适用于标准类型的子工作流。对于使用快速类型的子工作流的redriven Map Run,RedriveTime 不可用。

来自正在运行的执行的内容包括以下格式的具体信息。

{ "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": "stateMachineName" }, "Task": { "Token": "h7XRiCdLtd/83p1E0dMccoxlzFhglsdkzpK9mBVKZsp7d9yrT1W" } }
注意

有关与 Map 状态相关的上下文对象数据,请参阅Map 状态的上下文对象数据

访问上下文对象

要访问上下文对象,首先通过将 .$ 附加到末尾来指定参数名称,就像选择带路径的状态输入时一样。然后,要访问上下文对象数据(而不是输入),请在路径前加上 $$.。这告诉你 Amazon Step Functions 使用路径在上下文对象中选择一个节点。

以下示例说明如何访问上下文对象,例如执行 ID、名称、开始时间和redrive计数。

检索执行 ARN 并将其传递给下游服务

此示例 Task 状态使用路径进行检索并将执行 Amazon 资源名称 (ARN) 传递给 Amazon Simple Queue Service (Amazon SQS) 消息。

{ "Order Flight Ticket Queue": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage", "Parameters": { "QueueUrl": "https://sqs.us-east-1.amazonaws.com/123456789012/flight-purchase", "MessageBody": { "From": "YVR", "To": "SEA", "Execution.$": "$$.Execution.Id" } }, "Next": "NEXT_STATE" } }

有关在调用集成服务时使用任务令牌的更多信息,请参阅等待具有任务令牌的回调

访问处于 Pass 状态的执行开始时间和名称

{ "Comment": "Accessing context object in a state machine", "StartAt": "Get execution context data", "States": { "Get execution context data": { "Type": "Pass", "Parameters": { "startTime.$": "$$.Execution.StartTime", "execName.$": "$$.Execution.Name" }, "ResultPath": "$.executionContext", "End": true } } }

访问执行的redrive次数

以下 Task 状态定义示例显示了如何访问执行的redrive次数。

{ "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "Payload": { "Number.$": "$$.Execution.RedriveCount" }, "FunctionName": "arn:aws:lambda:us-east-2:123456789012:function:functionName" }, "End": true }

Map 状态的上下文对象数据

处理 Map 状态时,上下文对象中还有两个附加项:IndexValue。对于每次 Map 状态迭代,Index 包含当前正在处理的数组项的索引号,同时 Value 包含正在处理的数组项。在 Map 状态内,上下文对象包括以下数据:

"Map": { "Item": { "Index": Number, "Value": "String" } }

这些项仅在 Map 状态下可用,并且可以在 ItemSelector 字段中指定。

注意

您必须在主要 Map 状态的 ItemSelector 块中的上下文对象中定义参数,而不是在 ItemProcessor 部分中包含的状态中定义参数。

给定具有简单 Map 状态的状态机,我们可以按如下方式从上下文对象中注入信息。

{ "StartAt": "ExampleMapState", "States": { "ExampleMapState": { "Type": "Map", "ItemSelector": { "ContextIndex.$": "$$.Map.Item.Index", "ContextValue.$": "$$.Map.Item.Value" }, "ItemProcessor": { "ProcessorConfig": { "Mode": "INLINE" }, "StartAt": "TestPass", "States": { "TestPass": { "Type": "Pass", "End": true } } }, "End": true } } }

如果使用以下输入执行前一状态机,则将 IndexValue 插入到输出中。

[ { "who": "bob" }, { "who": "meg" }, { "who": "joe" } ]

执行的输出返回三次迭代中每次迭代的 IndexValue 项的值,如下所示:

[ { "ContextIndex": 0, "ContextValue": { "who": "bob" } }, { "ContextIndex": 1, "ContextValue": { "who": "meg" } }, { "ContextIndex": 2, "ContextValue": { "who": "joe" } } ]