AWS环境下Snowplow stream-enrich服务Kinesis分片同步异常求助
你说得没错,CloudWatch的发布警告大概率是分片租约同步失败引发的连锁问题,核心得先解决Kinesis分片与租约的同步异常。我整理了几个常见的排查方向,你可以逐一验证:
检查IAM角色权限
Stream-enrich依赖Kinesis Client Library(KCL)来管理分片租约,这个过程需要一系列AWS权限:- 针对Kinesis流:
kinesis:ListShards、kinesis:DescribeStreamSummary、kinesis:GetShardIterator - 针对租约存储用的DynamoDB表:
dynamodb:PutItem、dynamodb:GetItem、dynamodb:Scan、dynamodb:UpdateItem
确认运行stream-enrich的ECS/EKS任务或EC2实例所关联的IAM角色,已经配置了上述权限,避免细粒度权限策略遗漏了关键操作。
- 针对Kinesis流:
验证Kinesis流状态
先确认目标Kinesis流处于ACTIVE状态,没有被暂停、删除或处于更新中。可以用AWS CLI快速检查:aws kinesis describe-stream-summary --stream-name <你的Kinesis流名称>如果流状态异常,先修复流的问题再重启stream-enrich。
排查DynamoDB租约表
Snowplow用DynamoDB存储分片租约信息,这部分出问题会直接导致同步失败:- 确认租约表存在且状态正常,没有被误删或修改表结构(默认主键为
leaseKey) - 查看DynamoDB控制台的监控指标,重点看
ReadThrottleEvents和WriteThrottleEvents,如果有节流情况,需要调整表的读写容量模式(比如切换到按需模式)或扩容。
- 确认租约表存在且状态正常,没有被误删或修改表结构(默认主键为
检查KCL版本兼容性
部分旧版本的KCL存在分片同步的已知bug,比如在流分片拆分/合并后无法正确同步。确认你使用的stream-enrich版本对应的KCL版本,是否有官方文档提到的兼容性问题,必要时升级到Snowplow推荐的稳定版本。开启详细日志定位具体错误
默认日志可能只提示异常但没给出细节,你可以调整stream-enrich的日志配置(比如log4j2.xml),把com.amazonaws.services.kinesis.clientlibrary.lib.worker.ShardSyncTask的日志级别调到DEBUG,这样能看到同步过程中具体的错误原因(比如权限拒绝、资源不存在、网络超时等)。
如果是刚创建的Kinesis流,也可以等几分钟再重启服务——新流的分片初始化可能需要一点时间。
内容的提问来源于stack exchange,提问作者Prakhar Mishra

