将文件从一个S3存储桶移动到另一个文件,最近两天更新

时间:2018-10-02 01:00:38

标签: python amazon-s3 aws-lambda etl

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

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

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

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

在复制到另一个存储桶或同一存储桶中的另一个文件夹时,是否可以过滤出文件?

谢谢

1 个答案:

答案 0 :(得分:2)

您不能使用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

希望有帮助。