EventBridge管道传递DynamoDB流至Step Function时,如何将数组输入转为单个对象?
EventBridge管道传递DynamoDB流至Step Function时,如何将数组输入转为单个对象?
我之前也碰到过一模一样的问题!EventBridge Pipe哪怕把批量大小设成1,还是会把单个DynamoDB流事件包装成数组传给Step Function,确实有点坑。给你几个亲测有效的解决办法:
方法一:用EventBridge Pipe的输入转换器直接提取
你之前的思路是对的,只是可能模板的配置细节没搞对。按下面的步骤来配置Pipe的输入转换:
- 打开你的EventBridge Pipe配置页面,找到Input transformation部分
- 输入路径(Input Path)保持默认的
$就行,不用修改 - 模板(Template)直接填写
<$[0]>—— 这个语法会直接提取输入数组的第一个元素(也就是你要的单个DynamoDB事件对象),作为Step Function的输入- 如果之后需要把这个对象包在
payload字段里,那模板就写{"payload": <$[0]>},注意这是合法的JSON格式,别写错符号
- 如果之后需要把这个对象包在
要是之前这么配还失败,建议检查下Pipe的权限有没有问题,或者看看CloudWatch日志里的具体错误信息,大概率是模板语法或者权限的小问题。
方法二:在Step Function的起始状态做转换
如果Pipe的输入转换器暂时搞不定,也可以在Step Function里处理。给起始状态加个Pass状态,专门用来提取数组元素:
在Pass状态的Parameters里这么写:
"Parameters": { "event.$": "$[0]" }
这样后续的状态就能直接用$.event拿到单个事件对象了。如果不想用Pass状态,也可以用一个简单的Lambda函数来做同样的提取,不过Pass状态更轻量,不用额外资源。
补充说明
为啥会出现这种情况?其实是EventBridge Pipe的设计逻辑:不管你把批量大小设成多少,它都会把收集到的事件包装成数组传递,哪怕只有一个事件也不例外。所以必须做这一步转换才能拿到单个对象。
备注:内容来源于stack exchange,提问作者florian norbert bepunkt
相关产品推荐
相关产品推荐

