如何将waitForTaskToken步骤的输入数据传递至后续步骤?
解决方案:保留原始数据传递至StateC
针对你的需求,有两种可行的方法可以让StateC获取到生成TaskToken前的原始数据,无需修改send-task-token-success的发送内容:
方法1:用ResultPath合并原始输入与回调数据
默认情况下,waitForTaskToken类型的Task状态会用send-task-token-success发送的额外数据完全覆盖当前输入。通过配置ResultPath,可以让状态输出同时保留原始输入和回调数据。
修改StateB的配置,新增ResultPath字段:
StateB: Type: Task Resource: 'arn:aws:states:::lambda:invoke.waitForTaskToken' Parameters: FunctionName: Fn::GetAtt: [ LambdaB, Arn ] Payload: input.$: '$' taskToken.$: '$$.Task.Token' TimeoutSeconds: 300 ResultPath: "$.callbackResult" # 将回调数据存入指定字段,原始输入保留 Next: StateC
修改后,StateB的输出结构会变成:
{ "原始输入字段1": "对应值", "原始输入字段2": "对应值", "callbackResult": "send-task-token-success发送的额外数据" }
StateC可以直接读取到原始输入的所有数据,同时也能获取回调的额外数据。
方法2:用执行上下文存储原始数据
如果不想修改主数据结构,可以在进入StateB前,通过Pass状态把原始数据存入Step Functions的执行上下文,之后在StateC中引用上下文数据。
修改状态机定义,在StateA和StateB之间新增一个Pass状态:
StartAt: StateA States: StateA: Type: Task Resource: Fn::GetAtt: [LambdaA, Arn] Next: SaveOriginalData SaveOriginalData: Type: Pass Parameters: "originalData.$": "$" ResultPath: "$$.Execution.Context" Next: StateB StateB: Type: Task Resource: 'arn:aws:states:::lambda:invoke.waitForTaskToken' Parameters: FunctionName: Fn::GetAtt: [ LambdaB, Arn ] Payload: input.$: '$' taskToken.$: '$$.Task.Token' TimeoutSeconds: 300 OutputPath: '$' Next: StateC StateC: Type: Task Resource: Fn::GetAtt: [LambdaC, Arn] Parameters: "originalData.$": "$$.Execution.Context.originalData" # 从上下文读取原始数据 "callbackData.$": "$" # 读取回调的额外数据 End: true
这种方式下,StateC的输入会同时包含原始数据和回调数据,且不会改变StateB的输出逻辑。注意:执行上下文有8KB的大小限制,若原始数据过大不建议使用此方法。
内容的提问来源于stack exchange,提问作者zlZimon
相关产品推荐
相关产品推荐

