【问题标题】:How can I set the destination filename for AWS Firehose on S3?如何在 S3 上设置 AWS Firehose 的目标文件名?
【发布时间】:2018-03-27 13:45:01
【问题描述】:

我正在处理一个添加到 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 存储桶的名称、缓冲提示、压缩和加密)。

【问题讨论】:

  • 这个问题通过第二个 lambda 解决了

标签: amazon-kinesis-firehose


【解决方案1】:

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

但是如果您正在寻找一些动态命名,不幸的是,目前这是不可能的。请参阅此问题以获取详细答案- Storing Firehose transfered files in S3 under custom directory names

【讨论】:

    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2020-06-24
      • 1970-01-01
      相关资源
      最近更新 更多