【问题标题】: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 存储桶的名称、缓冲提示、压缩和加密)。
【问题讨论】:
标签:
amazon-kinesis-firehose
【解决方案2】:
我也对无法动态指定文件名称感到不满意,因此我创建了一个 lambda 函数来重命名我的 Kinesis 流输出的文件。这些是我采取的步骤
- 我在我的 Kinesis 数据中包含了我想要的文件名。
- 我创建了一个新的 lambda 函数,设置为在 kinesis 输出文件时运行。
- 我的 lambda 函数:
- 打开我的文件
- 获取新文件名
- 创建新文件
- 删除命名错误的旧文件。
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()