如何在Step Function任务的Input Path中访问字符串化JSON?
问题解答
1. 能否直接传入event.body给StartExecutionCommand的input参数?
取决于event.body的实际类型:
- 若Lambda由API Gateway触发,默认
event.body本身就是字符串类型(API Gateway会自动将请求体序列化为字符串),这种场景下可以直接传input: event.body,无需额外调用JSON.stringify。但要确保event.body是有效的JSON格式,否则Step Functions后续解析会出错。 - 若你的
event.body已经是解析后的JSON对象(比如自定义了Lambda输入转换规则),则必须用JSON.stringify(event.body)转成字符串后再传入,因为StartExecutionCommand要求input参数必须为字符串类型。
2. 如何访问Lambda传入的字符串化JSON中的特定键值对?
有两种实用方案:
方案一:在Step Functions中直接处理字符串化输入
Step Functions内置了States.StringToJson函数,可先将字符串转成JSON对象,再提取指定字段。注意不能直接在inputPath中使用转换函数,需在Parameters中结合路径表达式处理:
{ "Type": "Pass", "Parameters": { "targetSku.$": "States.StringToJson($).product.sku" }, "Next": "YourNextState" }
这里$代表整个输入字符串,States.StringToJson($)会将其转换为JSON对象,之后即可用product.sku路径提取目标值。
方案二:在Lambda中提前解析并处理
如果不需要将完整请求体传给Step Functions,可在Lambda内先解析字符串,提取需要的字段后再序列化为字符串传入:
// Lambda函数内处理逻辑 const parsedBody = JSON.parse(event.body); const stepFunctionParams = { stateMachineArn: process.env.STEP_FUNCTION_ARN!, // 仅传入需要的sku字段,减少Step Functions输入数据量 input: JSON.stringify({ sku: parsedBody.product.sku }), name: `NetSuiteInventorySet${Date.now()}${Math.floor(Math.random() * 1000)}` }; await client.send(new StartExecutionCommand(stepFunctionParams));
关于你的报错说明
你尝试的inputPath: JsonPath.stringToJson("$.product.sku")报错,原因是inputPath仅接受字符串类型的JSON路径表达式(比如"$.product.sku"),而JsonPath.stringToJson返回的是CDK的IResolvable类型对象,不符合inputPath的类型要求。换成上述方案一中Parameters结合内置函数的写法即可解决问题。
内容的提问来源于stack exchange,提问作者Lloukas
相关产品推荐
相关产品推荐

