【问题标题】:Moving Files from one S3 bucket to another which are updated in last two days将最近两天更新的文件从一个 S3 存储桶移动到另一个存储桶
【发布时间】:2018-10-02 01:00:38
【问题描述】:

我正在构建一个将数据从 s3 加载到 Amazon redshift 的数据管道,我有一个具有分层文件夹结构的 s3 存储桶,例如

Amazon S3>bucket-name/10849813427/2.0/2018/08/16/10958160321 

我的文件放在最后一个目录中(例如 10958160321)。

我的 S3 存储桶(存储桶名称)中有多个这样的文件夹,现在我想从这个 S3 存储桶中的所有这些文件夹中复制过去两天在另一个 S3 存储桶中具有“last_modified_date”的文件。我将使用我的 ETL 作业处理这些文件并在 Redshift 中加载数据。

有没有办法在复制到另一个存储桶或同一存储桶内的另一个文件夹时过滤掉文件?

谢谢

【问题讨论】:

  • 根据您的以下评论,您是否可以发布您的 boto3 解决方案或接受以下答案。 :)

标签: python amazon-s3 aws-lambda etl


【解决方案1】:

您不能使用 S3 修改任何对象。如果要更改现有对象,则需要删除现有对象并用新对象覆盖。这包括重命名及其元数据。

S3 元数据:

https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

您可以指定或循环多个日期以查找各个日期。

DATE=$(date +%Y-%m-%d)
aws s3 ls s3://bucket/2018/ --recursive | grep $DATE

关于可扩展性,如果您有更多对象,则在收集对象列表及其修改日期时会遇到时间问题。

S3 库存:

如果可以接受 24 小时的延迟来收集对象列表,您可以使用 S3 清单列出对象及其创建日期。

https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html

库存将被传送到 s3 存储桶,您可以触发 lambda,读取内容并将对象移动到正确的位置。

S3 复制:

您可以使用 cli/lambda 在存储桶之间或同一存储桶内进行复制。

aws s3 mv s3://bucket1/folder1  s3://bucket1/folder2  --recursive
aws s3 mv s3://bucket1/folder1  s3://bucket1/folder1  --recursive

EDIT1:

用于从源复制到目标的简单循环的实际脚本

#!/bin/sh                                                                                                                  
aws s3api list-objects --bucket "bucket-name" --prefix "prefix/foldername" --query "Contents[?LastModified>='2018-10-02'].{Key: Key}" --profile production | tr '\n' ' ' | jq -c '.[].Key' | while read i; do                                         
    aws s3 mv s3://sourbucket/$i s3://destinationbucket/                                                            
done

希望对你有帮助。

【讨论】:

  • 感谢您的回复,这让我有很多东西可以进一步浏览,我正在寻找的是如果我可以在将文件复制到另一个存储桶或文件夹时通过一个过滤器,如上一个示例中所述,我可以做类似的事情: aws s3 mv s3://bucket1/folder1 s3://bucket1/folder2 --recursive --query 'Contents[?LastModified>='2018-09-29'] 另外我需要动态给出日期,可以我使用类似 sysdate 的东西,而不是硬编码日期('2018-09-29')!
  • 添加了一个脚本,让你变得更懒惰:)。希望对您有所帮助。
  • 首先检查您的 awscli 版本。升级 awscli 1.11.47 -> 1.16.220 后工作
  • 谢谢。只需将-r 添加到最后一个jq 命令,它在awscli 1.16 上对我有用
【解决方案2】:

一种方法是从源存储桶中下载文件,暂存它,然后将其上传到目标存储桶

s3_client.download_file(key,download_path)

s3_client.upload_file(Bucket='destination-bucket',
filename=filename,
Key=key)

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 2016-02-10
    • 2020-06-09
    • 2020-09-15
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多