在 Step Functions 中从上下文对象访问执行数据 - AWS Step Functions

在 Step Functions 中从上下文对象访问执行数据

管理状态和转换数据

上下文对象是执行期间可用的内部 JSON 结构,包含有关状态机和执行的信息。上下文可为您的工作流提供有关其特定执行的信息。您的工作流可以使用 $states.context 引用 JSONata 表达式中的上下文对象。

访问上下文对象

访问 JSONata 中的上下文对象

要访问 JSONata 状态中的上下文对象,请在 JSONata 表达式中使用 $states.context

{ "ExecutionID" : "{% $states.context.Execution.Id %}" }

访问 JSONPath 中的上下文对象

要访问 JSONPath 中的上下文对象,首先要在键的末尾附加 .$ 以指示该值是路径。然后,在值前加上 $$. 以选择上下文对象中的节点。

{ "ExecutionID.$": "$$.Execution.Id" }

JSONPath 状态可以引用以下 JSONPath 字段中的上下文($$.):

  • 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" } }

在执行期间,上下文对象将以相关数据填充。

有时,上下文中会添加新字段。如果您要直接处理 JSON 上下文,建议您编写能够妥善处理新的未知字段的代码。例如,如果使用 Jackson 库对 JSON 进行解组,建议在您的 ObjectMapper 中将 FAIL_ON_UNKNOWN_PROPERTIES 设置为 false 以防止 UnrecognizedPropertyException

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

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

{ "Execution": { "Id": "arn:aws:states:region:123456789012:execution:stateMachineName:executionName", "Input": { "key": "value" }, "Name": "executionName", "RoleArn": "arn:aws:iam::123456789012:role...", "StartTime": "2025-08-27T10:04:42Z" }, "State": { "EnteredTime": "2025-08-27T10:04:42.001Z", "Name": "Test", "RetryCount": 3 }, "StateMachine": { "Id": "arn:aws:states:region:123456789012:stateMachine:stateMachineName", "Name": "stateMachineName" }, "Task": { "Token": "h7XRiCdLtd/83p1E0dMccoxlzFhglsdkzpK9mBVKZsp7d9yrT1W" } }
具有小数秒精度的时间戳格式

Step Functions 遵循 ISO8601 规范,该规范规定输出可以是零、三、六或九位数字,具体视情况而定。当时间戳的小数秒部分为零时,Step Functions 会移除末尾的零,而不会对输出进行补零填充。

如果您创建的代码使用 Step Functions 时间戳,则您的代码必须能够处理可变数量的小数秒。

Map 状态的上下文对象数据

管理状态和转换数据

处理 Map 状态时,上下文还将包含 IndexValueSource

对于每次 Map 状态迭代,Index 包含当前正在处理的数组项的索引号,Value 包含正在处理的数组项,并且 Source 的 InputType 将为 CSVJSONJSONLPARQUET

Map 状态内,上下文对象包括以下数据:

"Map": { "Item": { "Index" : Number, "Key" : "String", // Only valid for JSON objects "Value" : "String", "Source": "String" } }

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

注意

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

给定使用 JSONPath Map 状态的状态机,您可以按如下方式从上下文对象中注入信息。

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

对于 JSONata,可以从 $states.context 变量访问其他 Map 状态上下文信息:

{ "StartAt": "ExampleMapState", "States": { "ExampleMapState": { "Type": "Map", "ItemSelector": { "ContextIndex": "{% $states.context.Map.Item.Index %}", "ContextValue": "{% $states.context.Map.Item.Value %}", "ContextSource": "{% $states.context.Map.Item.Source %}" }, "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" }, "ContextSource" : "STATE_DATA" }, { "ContextIndex": 1, "ContextValue": { "who": "meg" }, "ContextSource" : "STATE_DATA" }, { "ContextIndex": 2, "ContextValue": { "who": "joe" }, "ContextSource" : "STATE_DATA" } ]

请注意,$states.context.Map.Item.Source 将是以下项之一:

  • 对于状态输入,该值将为:STATE_DATA

  • 对于 Amazon S3 LIST_OBJECTS_V2Transformation=NONE),该值将显示存储桶的 S3 URI。例如:S3://bucket-name

  • 对于所有其他输入类型,该值将为 Amazon S3 URI。例如:S3://bucket-name/object-key