【问题标题】:Push Firehose messages to an S3 bucket with minimal PUTs将 Firehose 消息推送到具有最少 PUT 的 S3 存储桶
【发布时间】:2019-04-30 14:31:06
【问题描述】:

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

我们可以使用 Lambda 函数将每条 Kinesis 消息转储到 S3 中的新文件中。但许多小型 PUT 的成本很高,尤其是因为这些数据不会经常被访问(如果是,则手动访问)。

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

我目前的想法是使用附加到 Firehose 的 Lambda 函数,因此 Firehose 会在 X 分钟内聚合记录,然后我们对其进行压缩/压缩,为每条记录创建一个文件,并将其作为单个存档发送到 S3。

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

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda amazon-kinesis-firehose


    【解决方案1】:

    如果你可以接受 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 准备结果)。

    【讨论】:

    • 关于 Kinesis 保留期的要点,我不知道。非常感谢您提供全面的想法。后一种 Lambda 方法似乎最常见,并且与我们当前的计划相似,因此我们将尝试这样做。
    猜你喜欢
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2020-07-26
    • 2022-01-07
    • 2021-05-07
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多