AWS EventBridge Input Transformer如何生成合法JSON数组?
解决EventBus InputTransformer生成数组格式JSON的引号缺失问题
问题核心
需要将EventBus事件中detail字段的完整JSON结构,直接放入带有customField属性的数组对象中,但使用带方括号的InputTemplate时,生成的JSON因缺失引号格式无效进入死信队列;去掉方括号则格式正常但不符合数组需求,且逐个映射字段的方案不适用于多字段场景,EventBridge Pipes也存在相同问题。
正确的InputTransformer配置方案
要实现需求且保证JSON格式有效,需正确配置InputPathsMap和InputTemplate:
配置InputPathsMap
提取事件中的detail字段作为模板变量:{"detail": "$.detail"}配置InputTemplate
用变量直接构造数组结构,模板本身需是有效的JSON框架:{"customField": [ <detail> ]}
关键注意事项
- 模板中的
<detail>是变量占位符,会被替换为detail字段的完整JSON对象,最终生成的结构为:{ "customField": [ { // 这里是detail的原始JSON结构 } ] } - 通过CLI/CloudFormation配置时,需注意字符串转义:
- CloudFormation中用单引号包裹模板避免转义:
InputTransformer: InputPathsMap: detail: "$.detail" InputTemplate: '{"customField": [ <detail> ]}' - CLI中需转义双引号:
--input-transformer '{"InputPathsMap": {"detail": "$.detail"}, "InputTemplate": "{\"customField\": [ <detail> ]}"}'
- CloudFormation中用单引号包裹模板避免转义:
之前配置出错的原因
你遇到的引号缺失问题,大概率是模板配置时的语法错误导致:
- 若模板写成
{"customField": [<detail>]}(无空格),虽不影响JSON语法,但部分环境可能解析异常; - 若错误地将变量放在引号中(如
{"customField": ["<detail>"]}),会把detail的JSON转为字符串,导致结构不符合需求; - 控制台配置时未正确输入模板字符串,导致EventBridge解析时破坏了JSON结构。
替代方案(原生InputTransformer受限时)
如果上述配置仍无法解决问题(如复杂嵌套场景),可以用Lambda作为中间处理层:
- 将EventBus规则的目标设为Lambda函数;
- Lambda接收事件后,直接构造所需结构返回:
def lambda_handler(event, context): return { "customField": [event["detail"]] }
这种方式无需逐个映射字段,完全保留detail的原始结构,适配所有复杂场景。
内容的提问来源于stack exchange,提问作者Dmytro Pavlov
相关产品推荐
相关产品推荐

