向同S3桶不同路径投递日志需两个Kinesis Firehose传输流吗?
答案
不需要创建两个独立的Firehose传输流,单传输流开启动态分区即可完全满足你的需求,没必要拆成两个流徒增成本和维护量。
Firehose早期版本只支持固定S3前缀,所以很多老资料会说一个流只能写一个固定路径,但动态分区功能上线多年,原生支持根据记录元数据/内容自动路由到同个S3桶下的不同前缀路径,完全匹配你的场景:
- 你的Lambda在调用
PutRecord/PutRecordBatch接口往Firehose写数据时,给每条记录附加分区键元数据即可:A类日志的分区键设为对应路径段logTypeA,B类设为logTypeB。这个分区键是接口入参的一部分,不会污染原始日志内容。 - 在Firehose的S3投递配置里打开动态分区开关,把前缀规则配置为
!{partitionKeyFromQuery:logType}/,Firehose会自动按照每条记录的分区键值拼出最终S3路径,A类日志全部落到logTypeA/目录,B类全部落到logTypeB/目录,不会混写。
CDK配置要点
你只需要定义一个Firehose传输流资源即可,给对应的S3目的地配置项开启动态分区参数,不需要建两个CfnDeliveryStream实例。如果有按日期分层的需求,还可以把动态分区键和Firehose内置的时间占位符组合使用,比如把前缀配成!{partitionKeyFromQuery:logType}/dt=!{timestamp:yyyy-MM-dd}/,就能同时实现按日志类型、按日期的目录分层。
方案对比
动态分区功能下,不同分区键值的数据缓冲、聚合是完全隔离的,只要你Lambda侧给日志打的类型标记没错,就不会出现日志错存路径的问题。和双流方案比:
- 成本更低:Firehose按传输流个数收取基础费用,单流省了一份基础成本,数据处理、写入的计费逻辑和双流完全一致
- 维护更简单:只需要维护一套传输流的权限、监控、缓冲配置,不用做两套重复资源
内容的提问来源于stack exchange,提问作者Naxi
相关产品推荐
相关产品推荐

