Истечение срока действия 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']
Более подробную информацию об установке политики истечения можно проверить на Политика истечения срока действия