我试图想办法清理我的s3水桶。我想删除所有超过X天的密钥(在我的情况下,X是30天)。
我无法想出一种删除s3中对象的方法。
我使用了以下方法,其中没有一个工作(通过工作,我的意思是我尝试在X天后获取对象,并且s3仍在服务对象。我期待“找不到对象”或“对象已过期”消息
方法1:
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})
方法2:
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对象,那将非常棒
答案 0 :(得分:15)
您可以使用lifecycle policies从s3中删除对象 超过X天。例如,假设你有这些 对象:
logs/first
logs/second
logs/third
otherfile.txt
要在30天后过期日志/过期,你会说:
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>
答案 1 :(得分:1)
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']
有关设置过期策略的详细信息,请参阅Expiry policy
答案 2 :(得分:0)
上述 Vaulstein 的python脚本引发格式错误的XML异常。请在“ '状态':'已启用',”行的末尾删除多余的“ ,”。
答案 3 :(得分:0)
session = boto3.Session(profile_name='my-aws-login-profile', region_name='ap-south-1')
s3 = session.resource('s3')
bucket_lifecycle_configuration = s3.BucketLifecycleConfiguration('my-s3bucket')
try:
bucket_lifecycle_configuration.put(
LifecycleConfiguration={
'Rules': [
{
'Expiration': {
'Days': 7
},
'ID': 'life cycle config for log folder',
'Filter': {
'Prefix': 'logs/',
},
'Status': 'Enabled',
'NoncurrentVersionExpiration': {
'NoncurrentDays': 7
},
'AbortIncompleteMultipartUpload': {
'DaysAfterInitiation': 7
}
},
]
}
)
except Exception as e:
print e.message
exit(1)
已解析的XML响应:
<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
<Rule>
<ID>life cycle config for log folder</ID>
<Filter>
<Prefix>logs/</Prefix>
</Filter>
<Status>Enabled</Status>
<Expiration>
<Days>7</Days>
</Expiration>
<NoncurrentVersionExpiration>
<NoncurrentDays>7</NoncurrentDays>
</NoncurrentVersionExpiration>
<AbortIncompleteMultipartUpload>
<DaysAfterInitiation>7</DaysAfterInitiation>
</AbortIncompleteMultipartUpload>
</Rule>
</LifecycleConfiguration>