AWS Step Functions如何将定义的参数传递至后续状态?
问题背景
我的输入JSON包含"raw_filename": "myfile",第一步任务的Parameters配置如下:
"Parameters": { "file_a_path.$": "States.Format('s3:/mybucket/{}', $.raw_filename)", "file_b_path.$": "States.Format('s3:/mybucket/{}_firstprocess', $.raw_filename)" }
这个任务会处理文件A生成文件B,现在需要在后续任务中处理文件B生成文件C,我想知道有没有办法直接把file_b_path作为输出传递到下一步?
我知道可以设置"ResultPath": null来传递原始输入,然后在后续步骤的Parameters里重新定义file_b_path,但直接传递这个参数会更健壮。
解决方案
当然可以直接传递file_b_path,核心是利用ResultPath和OutputPath的组合,或者直接在任务输出中保留需要的参数:
方法1:用ResultPath合并参数与原始输入
如果第一步任务本身会输出执行结果,同时你想保留file_b_path,可以这样配置:
"第一步任务": { "Type": "Task", "Resource": "arn:aws:lambda:xxx:xxx:function:你的处理函数", "Parameters": { "file_a_path.$": "States.Format('s3:/mybucket/{}', $.raw_filename)", "file_b_path.$": "States.Format('s3:/mybucket/{}_firstprocess', $.raw_filename)" }, // 将Parameters中的file_b_path合并到原始输入结构中 "ResultPath": "$.taskContext", "OutputPath": "$" }
下一步的输入会包含原始raw_filename和新增的file_b_path,你也可以调整OutputPath只保留需要的内容,比如"OutputPath": "$.taskContext.file_b_path",直接只传递这个路径。
方法2:让任务直接返回file_b_path
如果你的处理函数(比如Lambda)可以直接返回file_b_path,可以简化配置:
"第一步任务": { "Type": "Task", "Resource": "arn:aws:lambda:xxx:xxx:function:你的处理函数", "Parameters": { "file_a_path.$": "States.Format('s3:/mybucket/{}', $.raw_filename)", "file_b_path.$": "States.Format('s3:/mybucket/{}_firstprocess', $.raw_filename)" }, // 直接将任务输出作为下一步的输入(假设Lambda返回的就是file_b_path的值) "ResultPath": "$" }
后续步骤可以直接通过$.file_b_path(若Lambda返回字符串则直接用$)引用该路径。
方法3:用Pass步骤单独传递参数
如果第一步任务的输出无需保留,只想传递file_b_path,可以添加一个Pass步骤:
"传递file_b_path": { "Type": "Pass", "Parameters": { "file_b_path.$": "$.file_b_path" }, "ResultPath": "$" }
将这个步骤放在第一步之后,后续任务就能直接使用$.file_b_path。
总结来说,最灵活的方式是通过ResultPath控制输出结构,确保file_b_path被包含在传递给下一步的输入中,避免重复计算路径,让流程更健壮。
内容的提问来源于stack exchange,提问作者Scott

