2013-02-19 32 views
10

Tôi đã cố gắng tìm ra cách dọn sạch xô s3 của mình. Tôi muốn xóa tất cả các khóa cũ hơn X ngày (Trong trường hợp của tôi X là 30 ngày).Hết hạn đối tượng S3 bằng boto

Tôi không thể tìm ra cách xóa đối tượng trong s3.

Tôi đã sử dụng các cách tiếp cận sau, không có cách nào trong số đó hoạt động (Bằng cách làm việc, ý tôi là tôi đã cố gắng nhận đối tượng sau X ngày và s3 vẫn đang phục vụ đối tượng. nhắn

Tiếp cận 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}) 

Phương pháp 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) 

Nếu bất cứ ai có thể chia sẻ mã mà đang làm việc cho họ, mà xóa đối tượng s3, mà có thể thực sự tuyệt vời

Trả lời

12

Bạn có thể sử dụng lifecycle policies để xóa các đối tượng khỏi s3 mà cũ hơn X ngày. Ví dụ, giả sử bạn có những đối tượng:

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

Để hết hạn tất cả mọi thứ dưới logs/sau 30 ngày, bạn muốn nói:

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) 

Bạn cũng có thể lấy lại cấu hình vòng đời:

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

Tôi đã cố gắng để kiểm tra điều này, và tự hỏi nếu hết hạn có thể được kiểm tra bằng cách sử dụng phút/giây. Có vẻ như ngày = 1 là thời gian tối thiểu có thể được sử dụng – user2005798

+0

Không có cách nào để sử dụng phút/giây.Tối thiểu là 0 ngày và đảm bảo duy nhất là AWS sẽ thực hiện hành động trước ngày hôm sau nửa đêm UTC theo [vòng đời của nhóm PUT] (http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html) . – MeSee

+0

Vui lòng thay đổi LifeCycle thành Lifecycle trong "từ boto.s3.lifecycle import LifeCycle" vì Vòng đời là tên đúng của lớp. – AliBZ

0

Câu trả lời bằng jamesis đang sử dụng boto là phiên bản cũ hơn và sẽ không được dùng nữa . Phiên bản hiện tại được hỗ trợ là boto3.

Chính sách hết hạn cùng vào thư mục bản ghi có thể được thực hiện như sau:

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

này sẽ ghi đè bất kỳ chính sách cấu hình vòng đời tồn tại trên logs.

Một điều tốt để làm sẽ là để kiểm tra xem xô tồn tại và nếu bạn có quyền truy cập vào nó trước khi áp dụng cấu hình hết hạn tức là trước khi try-except

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

Kể từ thư mục logs tự isn' t một xô nhưng đúng hơn là một đối tượng trong thùng boto-lifecycletest, chính nhóm đó có thể có chính sách hết hạn khác. Bạn có thể kiểm tra điều này từ kết quả trong số policy_exists như dưới đây.

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

Thông tin thêm về cách thiết lập các chính sách hết hạn có thể được kiểm tra tại Expiry policy

Các vấn đề liên quan