使用最少的 PUT 将 Firehose 消息推送到 S3 存储桶

Push Firehose messages to an S3 bucket with minimal PUTs

我们有一个 AWS Kinesis 流,每秒摄取大约 15 条小二进制消息。作为最后的数据恢复策略,我们希望将所有收到的消息转储到具有 1-2 周 TTL 的 S3 存储桶中。

我们可以使用 Lambda 函数将每条 Kinesis 消息转储到 S3 中的新文件中。但是很多小的 PUT 是昂贵的,特别是因为这些数据不会经常访问(如果是的话手动访问)。

或者,AWS Firehose 会为我们聚合消息并将它们作为单个 S3 对象推送到 S3。但据我所知 - 请纠正我 - Firehose 只是连接记录,所以这在消息二进制和逻辑上分开的地方不起作用(与日志文件中的行不同)。

我目前的想法是使用附加到 Firehose 的 Lambda 函数,因此 Firehose 在 X 分钟内聚合记录,然后我们 zip/tar 向上,为每条记录创建一个文件,并作为单个存档发送到 S3 .

这样合适吗?如果是这样,我们如何使用 Lambda 聚合记录?我们处理多对一,所以我不确定要将哪些 result/status 代码传回 Firehose。 (AWS 生态系统对我来说很新,所以我想我可能错过了明显的解决方案。)

如果你能接受 1 周的 TTL,你可以增加流的 data retention period 而不必理会任何其他存储机制。

如果您愿意每天支付 86,400 个 PUT(0.43 美元),您可以获得 stream trigger your Lambda function。请注意,您实际上可能会更频繁地被调用,因为每个事件都有最大大小,并且每个分片都是单独调用的。

如果您想要更多控制权,我建议您从 CloudWatch Scheduled Event 调用您的 Lambda 函数。我相信最小间隔是一分钟。但是,如果您这样做,您还需要保留分片偏移量(例如,在 DynamoDB 中)并为重新分片做好准备。

如您所述,Firehose 不支持多对一转换。但是,您可以使用 Lambda 获取输入记录,对它们进行 base-64 编码,然后附加一个换行符(请注意,您需要进行两次 Base64 编码:一次作为记录转换,一次为 Firehose 准备结果)。