能否在AWS Step Functions的Choice状态中使用StringToJson内置函数?
我的场景是从队列获取的payload包含多类信息,关键信息位于body字段中,第一步通过如下Pass状态获取该字段:
"FormatData": { "Type": "Pass", "Next": "ChooseWhichCampaignToCreate", "InputPath": "$[0].body", "OutputPath": "$" },
但该输出是JSON格式的字符串,而非直接的JSON对象。目前我在后续Task状态中通过States.StringToJson($)将其转换为JSON对象:
"CreateSessionInviteCampaign": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "Coaching-EmailCampaign-Prepare", "Payload.$": "States.StringToJson($)" }, "Next": "ChoseWhichCampaignToPrepare" },
我正重构流程以增加更多Choice节点,确保每个Lambda仅处理特定范围的任务。查阅规范后发现Choice状态无Parameters字段,但支持InputPath。请问能否在InputPath中使用States.StringToJson($).CampaignType这类内置函数调用?还是必须新增一个Pass状态来转换JSON字符串(如以下示例,我希望避免为此定义基础Lambda):
"JSONIfyOutput": { "Type": "Pass", "Parameters": { "Payload.$": "States.StringToJson($)" }, "OutputPath": "$" },
不能直接在Choice状态的InputPath中使用States.StringToJson()这类内置函数调用。
原因在于AWS Step Functions的InputPath仅支持JSONPath表达式,不允许嵌入内置函数(比如States.StringToJson())。内置函数只能在支持Parameter引用的状态中使用,比如Task、Pass、Map等状态的Parameters字段里,或者在OutputPath/ResultPath结合特殊引用的场景,但Choice状态本身没有Parameters字段,也不支持在InputPath中执行函数转换。
因此你必须新增一个Pass状态来完成JSON字符串到JSON对象的转换,之后再在Choice状态中使用JSONPath访问转换后的CampaignType字段。示例如下:
"JSONIfyOutput": { "Type": "Pass", "Parameters": { "$.$": "States.StringToJson($)" }, "Next": "ChooseWhichCampaignToCreate" }, "ChooseWhichCampaignToCreate": { "Type": "Choice", "Choices": [ { "Variable": "$.CampaignType", "StringEquals": "SessionInvite", "Next": "CreateSessionInviteCampaign" }, { "Variable": "$.CampaignType", "StringEquals": "Reminder", "Next": "CreateReminderCampaign" } ], "Default": "HandleUnknownCampaignType" }
上述Pass状态通过"$.$": "States.StringToJson($)"直接将转换后的JSON对象作为整个输出传递给下一个Choice状态,这样Choice节点就能正常用JSONPath访问$.CampaignType进行判断了,无需额外定义Lambda函数。
内容的提问来源于stack exchange,提问作者SomeStudent

