2013-02-19 54 views
10

我试图找出一种方法来清理我的S3桶。我想删除所有超过X天的密钥(在我的情况下,X是30天)。S3使用boto的对象过期

我找不出一种方法来删除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对象,这将非常好

回答

12

您可以使用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> 
+0

我是想测试这一点,并想知道如果到期可以用分/秒进行测试检查。 看起来像days = 1是可以使用的最短时间 – user2005798 2013-02-22 21:23:08

+0

没有办法使用分钟/秒。最低限度为0天,唯一的保证是AWS根据[PUT Bucket生命周期](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html)在次日午夜UTC之前采取行动。 。 – MeSee 2013-08-20 05:09:01

+0

请将LifeCycle更改为“from boto.s3.lifecycle import LifeCycle”中的生命周期,因为Lifecycle是正确的类名称。 – AliBZ 2013-08-31 00:03:40

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)) 

这将覆盖在logs任何现有的生命周期配置策略:

上的日志文件夹相同的到期策略可以如下进行。

一个很好的事情是检查如果桶存在,如果你有申请前的try-except

bucket_exists = client.head_bucket(
    Bucket='boto-lifecycle-test' 
) 

即到期构造。由于logs文件夹之前访问它的权限本身ISN” t存储桶而是存储桶boto-lifecycletest内的对象时,存储桶本身可以有不同的过期策略。 您可以从以下policy_exists的结果中进行检查。

policy_exists = client.get_bucket_lifecycle_configuration(
    Bucket='boto-lifecycle-test') 
bucket_policy = policy_exists['Rules'][0]['Expiration'] 

有关设置过期策略的更多信息,Expiry policy

相关问题