You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:03:26