使用EventBridge Pipe向Redshift插入动态数据失败求助
问题描述
- 用AWS EventBridge Pipe搭建了Kinesis到Redshift的数据管道,数据源、过滤、Enrichment环节均正常运行,日志无报错,但Redshift始终没有新数据写入
- 静态值的INSERT语句能正常插入数据,比如:
INSERT INTO public.event_bridge_test (id, status, test, test1) VALUES ('11234124321', '13123123' ,'test', 'test1'); - 但使用动态变量(如
$.data)的INSERT语句完全无效,尝试过多种JSON提取语法均无效果,包括:INSERT INTO public.event_bridge_test (id, status, test, test1) VALUES ('5', json_extract_path(to_json('$context.event.detail'), '$.data.status'), 'test', 'test1') INSERT INTO public.event_bridge_test (id, status, test, test1) VALUES ('6', $.data.status, 'test', 'test1') INSERT INTO public.event_bridge_test (id, status, test, test1) VALUES ('10', JSON_EXTRACT_PATH_TEXT('$context.event.detail','data', 'status'), 'test', 'test1') INSERT INTO public.event_bridge_test (id, status, test, test1) VALUES ('11234124321', '13123123' ,'test', TO_CHAR($));
解决方法
1. 修正动态变量引用逻辑
EventBridge Pipe的Redshift目标中,动态变量不能直接用$.data这类JSONPath写在SQL语句里,正确的做法是先用目标输入转换器把需要的字段提取出来,再用绑定变量引用:
- 输入转换器配置(JSON格式):
{ "static_id": "11234124321", "static_status": "13123123", "static_test": "test", "dynamic_test1": "$.data" } - 对应的INSERT语句:
INSERT INTO public.event_bridge_test (id, status, test, test1) VALUES (:static_id, :static_status, :static_test, :dynamic_test1);
2. 检查JSON提取语法的错误
之前尝试的语句里存在语法错误,比如:
- 错误写法:
json_extract_path(to_json('$context.event.detail'), '$.data.status')
这里的'$context.event.detail'是字符串字面量,不是变量引用,应该去掉单引号,直接用$context.event.detail - 如果要直接在SQL里提取JSON字段,确保用
input代表整个事件数据,比如:INSERT INTO public.event_bridge_test (id, status, test, test1) VALUES ('11234124321', '13123123', 'test', JSON_EXTRACT_PATH_TEXT(input, 'data'));
3. 排查Redshift端的隐性问题
- 查看Redshift的查询历史:日志显示Pipe正常不代表SQL执行成功,可能存在字段类型不匹配(比如
test1是INT类型,但$.data是字符串)、长度超限等隐性错误 - 检查权限:确认Pipe用的IAM角色有
redshift-data:ExecuteStatement权限,Redshift数据库用户有INSERT权限 - 关闭批量插入测试:如果开启了批量写入,可能数据还在缓存中未触发写入,临时关闭批量功能验证单条数据是否能正常写入
4. 验证事件数据结构
用Pipe的测试事件功能构造一条包含data: "hello world!"的测试数据,触发执行后查看Redshift的写入结果,确认事件结构和字段路径是否匹配预期
内容的提问来源于stack exchange,提问作者Luis Godínez
相关产品推荐
相关产品推荐

