2013-02-19 2 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, что бы be really great

ответ

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

Я пытался проверить это, и интересно, если действия могут быть проверены с помощью минут/секунд. Похоже дней = 1 - минимальное время, которое можно использовать – user2005798

+0

Невозможно использовать минуты/секунды.Минимальный срок составляет 0 дней, и единственной гарантией является то, что AWS принимает меры до следующего дня по полутону UTC в соответствии с [Жизненный цикл Bucket Bucket] (http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html) , – MeSee

+0

Пожалуйста, измените LifeCycle на Lifecycle в «из boto.s3.lifecycle import LifeCycle», поскольку Lifecycle - это правильное имя класса. – AliBZ

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

Смежные вопросы