Истечение срока действия S3 с использованием boto

Я пытался выяснить способ очистки моего ведро s3. Я хочу удалить все ключи старше X дней (в моем случае X - 30 дней).

Я не мог найти способ удалить объекты в 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, это было бы действительно замечательно

Ответ 1

Вы можете использовать политики жизненного цикла для удаления объектов из 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>

Ответ 2

Ответ 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 не является ведром, а скорее объектом в ведре boto-lifecycletest, сам ведро может иметь другую политику истечения срока действия. Вы можете проверить это из результата в policy_exists, как показано ниже.

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

Более подробную информацию об установке политики истечения можно проверить на Политика истечения срока действия