Python 使用boto的S3对象过期
我在想办法清理我的s3桶。我想删除所有早于X天的密钥(在我的例子中X是30天) 我想不出删除s3中对象的方法 我使用了以下方法,但没有一种有效(所谓有效,我的意思是我在X天后尝试获取对象,而s3仍然在为该对象提供服务 方法1:Python 使用boto的S3对象过期,python,amazon-s3,boto,Python,Amazon S3,Boto,我在想办法清理我的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
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对象,那将非常好您可以使用它从s3中删除对象
大于X天。例如,假设您有
对象:
要在日志/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>
>>config=bucket.get\u lifecycle\u config()
>>>打印(配置[0])
>>>打印(配置[0]。前缀)
日志/
>>>打印(配置[0]。过期)
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))
这将覆盖日志上的任何现有生命周期配置策略
一个好办法是,在应用过期配置之前,即在try except
bucket_exists = client.head_bucket(
Bucket='boto-lifecycle-test'
)
由于logs
文件夹本身不是一个bucket,而是bucketboto-lifecycletest
中的一个对象,因此bucket本身可以具有不同的过期策略。
您可以从下面的policy\u exists
中的结果中检查这一点
policy_exists = client.get_bucket_lifecycle_configuration(
Bucket='boto-lifecycle-test')
bucket_policy = policy_exists['Rules'][0]['Expiration']
有关设置过期策略的详细信息,请参见上述由Vaulstein编写的python脚本引发格式错误的XML异常。请删除行末尾“'Status':'Enabled',”session=boto3.session(profile_name='my-aws-login-profile',region_name='ap-south-1'))
s3=会话资源('s3')
bucket\u lifecycle\u configuration=s3.BucketLifecycleConfiguration('my-s3bucket'))
尝试:
bucket\u lifecycle\u configuration.put(
生命周期配置={
“规则”:[
{
“到期日”:{
“天”:7天
},
“ID”:“日志文件夹的生命周期配置”,
“过滤器”:{
'前缀':'日志/',
},
“状态”:“已启用”,
“非当前版本支出”:{
“非当前日”:7
},
“中止完成多部分上载”:{
“Daysafterinition”:7
}
},
]
}
)
例外情况除外,如e:
打印电子邮件
出口(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>
日志文件夹的生命周期配置
日志/
启用
7.
7.
7.
我正在尝试测试这一点,想知道是否可以使用分钟/秒来测试过期时间。看起来天=1是可以使用的最短时间,没有使用分钟/秒的方法。最短是0天,唯一的保证是AWS it在第二天UTC午夜之前根据采取行动。请在中将生命周期更改为生命周期“从boto.s3.lifecycle导入生命周期"因为Lifecycle是正确的类名。是否有任何方法可以测试对象是否处于特定的生命周期中?您只需从@Vaulstein提交一个编辑请求以获取答案,或者将其添加为注释。这不应作为答案发布。我建议提交一个Editr。提交Editr时抛出一个错误“编辑必须至少包含6个字符”Equist。谢谢你的建议。然后把它作为一个评论添加到答案中会更合适。@mbbce他可能想这样做,但他必须有至少20(?)的声誉才能这样做。你知道,我遇到了无限循环。
<?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>