使用boto设置S3对象过期时间
我在想办法清理我的s3存储桶。我想删除所有超过X天的文件(在我的情况下,X是30天)。
但是我找不到删除s3中对象的方法。
我尝试了以下几种方法,但都没有成功(我说的没有成功是指,我在X天后尝试访问这些对象,结果s3还是能找到这些对象。我本来期待看到“对象未找到”或“对象已过期”的提示)
方法一:
k = Key(bucket)
k.key = my_key_name
expires = datetime.utcnow() + timedelta(seconds=(10))
expires = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
k.set_contents_from_filename(filename,headers={'Expires':expires})
方法二:
k = Key(bucket)
k.key = "Event_" + str(key_name) + "_report"
expires = datetime.utcnow() + timedelta(seconds=(10))
expires = expires.strftime("%a, %d %b %Y %H:%M:%S GMT")
k.set_meta_data('Expires', expires)
k.set_contents_from_filename(filename)
如果有人能分享一下他们能成功删除s3对象的代码,那就太好了。
4 个回答
1
上面这个由 Vaulstein 写的 Python 脚本出现了一个“格式错误的 XML”异常。请把行末的多余的 "," 去掉,具体是 "'Status': 'Enabled'," 这一行的最后。
7
用户jamesis的回答使用了boto
,这是一个旧版本,未来会被淘汰。现在支持的版本是boto3
。
对日志文件夹设置相同的过期策略可以这样做:
import boto3
from botocore.exceptions import ClientError
client = boto3.client('s3')
try:
policy_status = client.put_bucket_lifecycle_configuration(
Bucket='boto-lifecycle-test',
LifecycleConfiguration={
'Rules':
[
{
'Expiration':
{
'Days': 30,
'ExpiredObjectDeleteMarker': True
},
'Prefix': 'logs/',
'Filter': {
'Prefix': 'logs/',
},
'Status': 'Enabled',
}
]})
except ClientError as e:
print("Unable to apply bucket policy. \nReason:{0}".format(e))
这将覆盖logs
上已有的生命周期配置策略。
在应用过期配置之前,最好先检查一下这个存储桶是否存在,以及你是否有权限访问它,也就是在try-except
之前。
bucket_exists = client.head_bucket(
Bucket='boto-lifecycle-test'
)
因为logs
文件夹本身不是一个存储桶,而是存储桶boto-lifecycletest
中的一个对象,所以这个存储桶可以有不同的过期策略。你可以通过policy_exists
的结果来检查这一点,如下所示。
policy_exists = client.get_bucket_lifecycle_configuration(
Bucket='boto-lifecycle-test')
bucket_policy = policy_exists['Rules'][0]['Expiration']
关于设置过期策略的更多信息,可以查看过期策略。
17
你可以使用生命周期策略来删除那些在S3中存放超过X天的文件。比如说,假设你有这些文件:
logs/first
logs/second
logs/third
otherfile.txt
如果你想在30天后删除logs/文件夹下的所有内容,你可以这样设置:
import boto
from boto.s3.lifecycle import (
Lifecycle,
Expiration,
)
lifecycle = Lifecycle()
lifecycle.add_rule(
'rulename',
prefix='logs/',
status='Enabled',
expiration=Expiration(days=30)
)
s3 = boto.connect_s3()
bucket = s3.get_bucket('boto-lifecycle-test')
bucket.configure_lifecycle(lifecycle)
你还可以查看生命周期配置:
>>> config = bucket.get_lifecycle_config()
>>> print(config[0])
<Rule: ruleid>
>>> print(config[0].prefix)
logs/
>>> print(config[0].expiration)
<Expiration: in: 30 days>