使用AWS Kinesis Firehose将数据写入S3桶的特定文件夹

9

我希望能够根据数据内容将数据发送到Kinesis Firehose。例如,如果我发送以下JSON数据:

{
   "name": "John",
   "id": 345
}

我希望根据ID过滤数据并将其发送到S3桶的子文件夹,例如:S3://myS3Bucket/345_2018_03_05。使用Kinesis Firehose或AWS Lambda是否有可能实现此目的?
目前我能想到的唯一方法是为每个可能的ID创建一个Kinesis流,并将它们指向同一个桶,然后在应用程序中发送我的事件到这些流中,但我希望避免这种情况,因为有很多可能的ID。

你找到这个问题的解决方案了吗?我正在寻找相同的情况。 - KM Prak
3个回答

5
您可能想使用 S3 事件通知,每当 Firehose 将一个新文件放入您的 S3 存储桶 (PUT) 时触发该事件;S3 事件通知应调用您编写的自定义 Lambda 函数,该函数读取 S3 文件的内容并将其拆分并写入到单独的存储桶中,需要注意的是每个 S3 文件很可能包含许多记录,而不仅仅是一个。详情请参考:https://aws.amazon.com/blogs/aws/s3-event-notification/

2
这是不可能的开箱即用,但是以下是一些想法...
您可以编写一个Lambda中的数据转换,它由Amazon Kinesis Firehose触发每个记录。您可以编写Lambda将数据保存到S3中的特定文件中,而不是让Firehose这样做。但是,您会错过Firehose的记录聚合功能。
您可以使用Amazon Kinesis Analytics查看记录,并基于内容将数据发送到不同的输出流。例如,您可以为每个传递通道设置单独的Firehose流,使用Kinesis Analytics查询选择目标。

0
如果您使用lambda来保存数据,那么最终会在S3上出现重复的数据。因为转换lambda会将数据添加回firehose,所以一个由lambda存储,另一个由firehose存储。除非有一种方法可以避免从lambda转换的数据重新添加到流中。我不知道有什么方法可以避免这种情况。

刚刚看到一篇帖子,说可以将结果标记为“已删除”,这样流就不会写入它,你就可以避免重复了 - https://www.reddit.com/r/aws/comments/7a3vfb/is_there_anyway_to_customize_the_resulting_s3/ - Rohan Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接