将超过 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 获得许可。)
有没有办法在一个 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 获得许可。)