Step Functions构造EventBridge Lambda嵌套JSON入参报错排查
核心错误原因
你现在的写法有两个致命问题:
States.Format的返回值是字符串类型,哪怕你拼的内容长得像JSON,本质还是字符串,不是结构化对象。而且用%s占位符插入对象类型的$.detail时,Step Functions会把对象序列化为类似Python字典的非标准字符串(就是报错里看到的service_name=Res这种无引号键值对格式),完全不符合JSON语法。- EventBridge的
PutEvents接口要求入参的Entries字段必须是数组/元组类型,你现在构造的是单个事件对象,类型不匹配直接触发参数校验错误。
正确实现方式
完全不要用字符串拼接构造JSON,Step Functions的ASL原生支持直接构造结构化JSON对象,通过.$后缀直接绑定动态字段即可,从根源上避免转义、类型错误。
你可以直接在Lambda任务的Parameters块里写合法的参数结构,示例如下:
"SendEventBridgeEvent": { "Type": "Task", "Resource": "arn:aws:lambda:<你的区域>:<你的账号ID>:function:<推送事件的Lambda函数名>", "Parameters": { "Entries": [ { "DetailType": "my_event", "Source": "自定义事件源名称,比如my.app.workflow", "Detail": { "Payload.$": "$.detail", "status": "active", "status_detail": "" } } ] }, "Next": "后续步骤名" }
写法说明:
- 最外层直接构造
Entries数组,满足EventBridge接口的类型要求,单条事件就放在数组的第一个元素位置即可 - 嵌套的
Payload字段通过"Payload.$": "$.detail"直接绑定Step Functions输入中的detail对象,Step Functions会自动把整个对象完整嵌入结构,不需要做任何格式转换 - 固定值(比如
status、DetailType)直接写静态内容即可,如果是动态字符串值,同样加.$后缀绑定对应输入路径就行,不需要用占位符拼接
你的Lambda函数收到这个入参之后,直接把event['Entries']传给boto3的put_events方法即可,不需要额外做JSON解析,传进来的已经是标准的Python列表+字典结构。
不推荐的兜底写法
如果你因为特殊场景必须用字符串拼接构造,需要额外做两步转换:先用States.JsonToString把要嵌入的对象转成JSON字符串插入模板,再用States.StringToJson把拼好的整个字符串转成结构化对象,最后用States.Array包装成Entries要求的数组格式。这种写法转义复杂极易出bug,非必要不要用:
// 仅作参考,不推荐 "detail_str.$": "States.JsonToString($.detail)", "event_str.$": "States.Format('{\"Payload\": {}}', $.detail_str)", "event_obj.$": "States.StringToJson($.event_str)", "Entries.$": "States.Array($.event_obj)"
内容的提问来源于stack exchange,提问作者user14065019
相关产品推荐
相关产品推荐

