将超过 100 天的 S3 文件移动到另一个存储桶

Move S3 files older than 100 days to another bucket

有没有办法在一个 S3 存储桶中找到所有超过 100 天的文件并将它们移动到另一个存储桶?欢迎使用 AWS CLI 或 SDK 的解决方案。 在 src 存储桶中,文件的组织方式类似于 bucket/type/year/month/day/hour/file
S3://my-logs-bucket/logtype/2020/04/30/16/logfile.csv
例如,在 2020/04/30 上,必须移动 2020/01/21 上或之前的日志文件。

如我评论中所述,您可以为 S3 存储桶创建生命周期策略。这是执行此操作的步骤 https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html

delete\expire 使用生命周期策略规则的对象是可选的,您可以定义要对 S3 存储桶中的对象执行的操作。

生命周期策略使用不同的存储 classes 来转换您的对象。在配置生命周期策略之前,我建议阅读不同的存储 classes,因为每个都有自己的相关成本:Standard-IA, One Zone-IA, Glacier, and Deep Archive storage classes

您的 100 天用例,我建议将您的日志转换到存档存储 class,例如 S3 Glacier。这可能被证明更具成本效益。

这里有一些 Python 代码可以:

  • 如果文件早于给定时间段,则将文件从 Bucket-A 移动到 Bucket-B
  • 将保留全名和路径
import boto3
from datetime import datetime, timedelta

SOURCE_BUCKET = 'bucket-a'
DESTINATION_BUCKET = 'bucket-b'

s3_client = boto3.client('s3')

# Create a reusable Paginator
paginator = s3_client.get_paginator('list_objects_v2')

# Create a PageIterator from the Paginator
page_iterator = paginator.paginate(Bucket=SOURCE_BUCKET)

# Loop through each object, looking for ones older than a given time period
for page in page_iterator:
    for object in page['Contents']:
        if object['LastModified'] < datetime.now().astimezone() - timedelta(days=2):   # <-- Change time period here
            print(f"Moving {object['Key']}")

            # Copy object
            s3_client.copy_object(
                Bucket=DESTINATION_BUCKET,
                Key=object['Key'],
                CopySource={'Bucket':SOURCE_BUCKET, 'Key':object['Key']}
            )

            # Delete original object
            s3_client.delete_object(Bucket=SOURCE_BUCKET, Key=object['Key'])

它对我有用,但请在部署到生产环境之前在不太重要的数据上测试它,因为它会删除对象!

代码使用 paginator 以防存储桶中的对象超过 1000 个。

您可以根据需要更改时间段。

(除了根据本网站的服务条款授予的许可外,此 post 的内容还根据 MIT-0 获得许可。)