使用AWS Kinesis Firehose写入S3存储桶中的特定文件夹

时间:2018-05-14 23:55:51

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

我希望能够根据数据内容发送发送到kinesis firehose的数据。例如,如果我发送了这个JSON数据:

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

我想基于id过滤数据并将其发送到我的s3存储桶的子文件夹,如:S3:// myS3Bucket / 345_2018_03_05。 Kinesis Firehose或AWS Lambda可以实现这一切吗?

我现在能想到的唯一方法就是为每个可能的ID创建一个kinesis流,然后将它们指向同一个桶,然后将我的事件发送到我的应用程序中的那些流,但我会喜欢避免这种情况,因为有很多可能的ID。

3 个答案:

答案 0 :(得分:3)

您可能希望使用每次Firehose在S3存储桶(PUT)中放置新文件时触发的S3事件通知; S3事件通知应调用您编写的自定义lambda函数,该函数读取S3文件的内容并将其拆分并将其写入单独的存储桶,请记住每个S3文件可能包含许多记录,而不是只有一个。

https://aws.amazon.com/blogs/aws/s3-event-notification/

答案 1 :(得分:1)

这不是开箱即用的,但这里有一些想法......

您可以为每条记录编写由Amazon Kinesis Firehose触发的Data Transformation in Lambda。您可以编写Lambda代码来保存以将数据保存到S3中的特定文件,而不是让Firehose执行此操作。但是,你会错过Firehose的记录聚合功能。

您可以使用Amazon Kinesis Analytics根据内容查看记录和send the data to a different output stream。例如,您可以为每个投放渠道设置单独的Firehose流,Kinesis Analytics查询会选择目的地。

答案 2 :(得分:0)

如果使用lambda保存数据,则最终会将重复数据存储到s3上。由于转换lambda,一个由lambda存储,另一个由firehose存储,因为转换lambda会将数据添加回firehose。除非有一种方法可以避免将来自lambda的转换数据重新添加到流中。我不知道一种避免这种情况的方法