2013-02-19 21 views
10

s3 grubumu temizlemenin bir yolunu bulmaya çalışıyordum. X günden daha eski olan tüm anahtarları silmek istiyorum (Benim durumumda X 30 gündür).S3 boto Kullanarak Object Expiration

S3'teki nesneleri silmenin bir yolunu çözemedim.

Aşağıdaki yaklaşımları kullandım, bunların hiçbiri işe yaramadı (Çalışarak, yani X gününden sonra nesneyi almayı denedim ve s3 hala nesneye hizmet ediyordu. "Nesne bulunamadı" veya "Nesne sona ermiş" bekleniyordu. mesajı

Yaklaşım 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}) 

Yaklaşım 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) 

kimse s3 nesneleri siler onlar için çalışıyordu kodu, paylaşabilir, bu olur gerçekten harika ol

cevap

12

lifecycle policies numaralı telefonu kullanarak, 'un X gününden daha eski olan nesnelerini s3'ten silebilirsiniz. Örneğin, bu nesneleri olduğunu varsayalım:

logs/first 
logs/second 
logs/third 
otherfile.txt 

günlükleri altında herşeyi sona için/30 gün sonra, derdin ki:

:

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) 

Ayrıca yaşam döngüsü yapılandırmasını alabilir

>>> config = bucket.get_lifecycle_config() 
>>> print(config[0]) 
<Rule: ruleid> 
>>> print(config[0].prefix) 
logs/ 
>>> print(config[0].expiration) 
<Expiration: in: 30 days> 
+0

de kontrol edilebilir. Gün gibi görünüyor = 1, kullanılabilecek minimum süre – user2005798

+0

Dakika/saniye kullanma yolu yok.Minimum süre 0 gündür ve tek garanti, AWS'nin, [PUT Kova yaşam döngüsü] uyarınca bir sonraki gün gece yarısı UTC'den önce işlem yapmasıdır (http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html) . – MeSee

+0

Yaşam Döngüsü, doğru sınıf adı olarak "boto.s3.lifecycle import LifeCycle" bölümündeki LifeCycle öğesini Yaşam Döngüsü olarak değiştirin. – AliBZ

0

jamesis numaralı yanıt, eski bir sürüm olan boto kullanıyor ve kullanımdan kaldırılacak . Güncel desteklenen sürüm 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)) 

Bu logs üzerinde varolan herhangi bir yaşam döngüsü yapılandırma politikasını geçersiz kılar şu şekildedir:

günlükleri klasörde aynı sona erme politikası

yapılabilir.

yapmak iyi bir şey kova var ve siz logs klasöre yana try-except

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

önce yani son kullanma yapılandırmasını uygulamadan önce onu erişim izinleri varsa kendisi diye bir şey yok olmadığını kontrol etmek olurdu Bir kova yerine, bir kova boto-lifecycletest içinde bir nesne, kova kendisi farklı bir son kullanma politikası olabilir. Bunu aşağıdaki gibi kontrol edebilirsiniz: policy_exists. Son kullanma politikasını ayarlama hakkında

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

fazla bilgi Bunu test etmek çalışıyorum ve son kullanma dakika/saniye kullanılarak test edilebilir olmadığını merak Expiry policy

İlgili konular