如何在S3上为AWS Firehose设置目标文件名?

时间:2018-03-27 13:45:01

标签: amazon-kinesis-firehose

我正在处理添加到S3的XML文件并将结果写入firehose,并将结果存储在同一个S3存储桶中,但目标文件名必须采用特定格式。我正在检查文档,我看不到任何设置文件名格式的方法。 我能找到的最近的是firehose FAQ

  

问:Amazon Kinesis Data Firehose提供的Amazon S3对象的命名模式是什么?

     

Amazon S3对象名称遵循DeliveryStreamName-DeliveryStreamVersion -YYYY-MM-DD-HH-MM-SS-RandomString模式,其中DeliveryStreamVersion以1开头,并且对于传递流的每次配置更改都增加1。您可以使用Firehose控制台或UpdateDestination操作更改传送流配置(例如,S3存储桶的名称,缓冲提示,压缩和加密)。

2 个答案:

答案 0 :(得分:3)

如果您使用静态命名,可以通过Firehose控制台或UpdateDestination操作指定它。

但是,如果你正在寻找一些动态命名,不幸的是,目前它是不可能的。有关详细回答,请参阅此问题 - Storing Firehose transfered files in S3 under custom directory names

答案 1 :(得分:2)

我也对不能动态指定文件名感到不满意,因此我做了一个lambda函数来重命名Kinesis流输出的文件。这些是我采取的步骤

  • 我在Kinesis数据中包含了所需的文件名。
  • 我创建了一个新的lambda函数,该函数可以在kinesis输出文件时运行。
  • 我的lambda函数:
    1. 打开我的文件
    2. 获取新文件名
    3. 创建新文件
    4. 删除名称不正确的旧文件。
import boto3
import json


def lambda_handler(event, context):
    key = event["Records"][0]["s3"]["object"]["key"]
    bucket=event["Records"][0]["s3"]["bucket"]["name"]
    s3resource = boto3.resource('s3')
    obj = s3resource.Object(bucket, key)
    body = obj.get()['Body'].read()
    dic = json.loads(body)
    my_new_file_name= dic["my_new_file_name"]
    s3resource.Object(bucket, str(my_new_file_name).copy_from(CopySource=f'{bucket}/{key}')
    s3resource.Object(bucket, key).delete()