2013-02-19 46 views
10

का उपयोग करके मैं अपनी एस 3 बाल्टी को साफ करने का तरीका जानने का प्रयास कर रहा था। मैं X दिनों से पुराने सभी कुंजियों को हटाना चाहता हूं (मेरे मामले में एक्स 30 दिन है)।एस 3 ऑब्जेक्ट समाप्ति बोटो

मैं एस 3 में वस्तुओं को हटाने का कोई तरीका नहीं समझ सका।

मैंने निम्नलिखित दृष्टिकोणों का उपयोग किया, जिनमें से कोई भी काम नहीं करता (काम करके, मेरा मतलब है कि मैंने एक्स दिनों के बाद ऑब्जेक्ट प्राप्त करने का प्रयास किया था, और एस 3 अभी भी ऑब्जेक्ट की सेवा कर रहा था। मुझे उम्मीद थी कि "ऑब्जेक्ट नहीं मिला" या "ऑब्जेक्ट समाप्त हो गया" संदेश

दृष्टिकोण 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 का उपयोग कर सकते हैं ताकि 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 दिन है और केवल गारंटी यह है कि एडब्ल्यूएस अगले दिन मध्यरात्रि यूटीसी [पुट बाल्टी लाइफसाइकिल] के अनुसार कार्रवाई करता है (http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html) । – MeSee

+0

कृपया लाइफसाइकल को लाइफसाइकिल में "boto.s3.lifecycle आयात लाइफसाइकल" में बदलें क्योंकि जीवन चक्र सही वर्ग का नाम है। – AliBZ

0

उत्तर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 पर किसी भी मौजूदा जीवन चक्र विन्यास नीति को पार कर जाएगी:

लॉग फ़ोल्डर पर एक ही समय सीमा समाप्ति नीति इस प्रकार किया जा सकता है।

करने के लिए एक अच्छी बात है, तो बाल्टी मौजूद है और अपने आप में isn 'आप समाप्ति विन्यास से पहले 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