AWS CloudFormation更新Lambda Kinesis触发器报分片速率超限如何解决
错误原因分析
- 报错中出现编号为
shardId-000000000004的分片,与你配置的2个分片数量不符,核心原因是该Kinesis流历史上执行过分片拆分操作:拆分后的旧分片默认会保留48小时(标准存储模式)或7天(长期存储模式),即使拆分完成后当前分片总数已调整为2,未过期的旧分片仍属于活跃可读取资源,Lambda事件源映射初始化时会遍历所有活跃分片,拉高了分片读取请求频率。 - Kinesis单分片默认读取配额为每秒5次GetRecords调用、总数据读取速率2MB/秒,若存在多个消费者同时读取同一分片、或者Lambda初始化时批量扫描大量历史分片,都会触发Rate exceeded限流报错。
- 当前CloudFormation配置未添加事件源映射的容错、流控参数,遇到限流错误时无重试机制,直接触发资源更新失败。
可行解决方案
- 先通过AWS CLI执行
aws kinesis list-shards --stream-name <替换为你的流名称>查看所有活跃分片,确认是否存在已拆分未过期的旧分片。若存在旧分片,可等待旧分片自动过期后再重新执行CloudFormation更新,也可以通过调整参数临时规避。 - 在CloudFormation的Lambda事件源映射配置中添加流控、容错参数,优化后的参考配置如下:
LambdaTrigger: Type: AWS::Lambda::EventSourceMapping Properties: StartingPosition: LATEST EventSourceArn: !Sub - arn:aws:kinesis:${region}:${accountId}:stream/${streamName} - region: !Ref 'AWS::Region' accountId: !Ref 'AWS::AccountId' streamName: !Ref KinesisStreamName FunctionName: !Ref KinesisReader # 新增流控容错参数 BatchSize: 100 # 降低单次拉取的记录数,减少单请求对配额的占用 MaximumBatchingWindowInSeconds: 5 # 拉长拉取时间窗口,平滑请求频率 MaximumRetryAttempts: 3 # 配置限流错误自动重试次数 ParallelizationFactor: 1 # 单分片并发消费数设为1,避免多并发拉高读取频率
- 若需要立即跳过历史分片扫描,可将
StartingPosition从LATEST改为AT_TIMESTAMP,指定一个晚于分片拆分完成时间的时间戳,让Lambda直接从新分片的最新位置开始消费。 - 如果当前Kinesis流的写入压力确实较高,可临时上调分片数,待CloudFormation部署完成后再调回预期的2个分片即可。
内容的提问来源于stack exchange,提问作者pritampanhale
相关产品推荐
相关产品推荐

