Политика жизненного цикла задаётся для бакета целиком в виде JSON-документа, который может содержать несколько правил. Ниже — как составить такой документ, применить его и проверить результат, а также готовые примеры правил для типовых задач. О самом механизме читайте в статье «Что такое жизненный цикл объектов в S3».
Что потребуется
- Настроенный профиль AWS CLI (см. «Как создать профиль подключения к S3 в AWS CLI»).
- Права на изменение конфигурации бакета.
- Для правил, работающих с версиями, — включённое версионирование.
- Адрес эндпоинта вашего бакета. Во всех примерах используется https://s3-msk2.rtcloud.ru и профиль rtcloud — подставляйте свои значения.
Шаг 1. Подготовьте файл с правилами
Создайте файл lifecycle.json. Ниже — политика из трёх правил: удаление логов через 30 дней, удаление неактуальных версий документов через 90 дней и прерывание незавершённых мультипартовых загрузок через 7 дней.
{
"Rules": [
{
"ID": "delete-old-logs",
"Status": "Enabled",
"Filter": {
"Prefix": "logs/"
},
"Expiration": {
"Days": 30
}
},
{
"ID": "cleanup-noncurrent-versions",
"Status": "Enabled",
"Filter": {
"Prefix": "documents/"
},
"NoncurrentVersionExpiration": {
"NoncurrentDays": 90
}
},
{
"ID": "abort-incomplete-uploads",
"Status": "Enabled",
"Filter": {},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
]
}
Пустой фильтр "Filter": {} означает, что правило применяется ко всем объектам бакета. Правила в одном документе обрабатываются независимо друг от друга.
Шаг 2. Примените политику
aws s3api put-bucket-lifecycle-configuration \
--bucket <ИМЯ_БАКЕТА> \
--lifecycle-configuration file://lifecycle.json \
--profile rtcloud \
--endpoint-url https://s3-msk2.rtcloud.ru
Важно! Команда полностью заменяет текущую политику бакета, а не дополняет её. Чтобы добавить правило к уже существующим, сначала выгрузите действующую конфигурацию, отредактируйте файл и примените его целиком.
Шаг 3. Проверьте результат
aws s3api get-bucket-lifecycle-configuration \
--bucket <ИМЯ_БАКЕТА> \
--profile rtcloud \
--endpoint-url https://s3-msk2.rtcloud.ru
Если в ответе вернулись все три правила со статусом Enabled, политика принята хранилищем. Срабатывать правила начнут не сразу — обработка выполняется фоново, с задержкой до суток.
Примеры правил для типовых задач
Удалить все объекты бакета через 7 дней
{
"ID": "expire-all",
"Status": "Enabled",
"Filter": {},
"Expiration": {
"Days": 7
}
}
Удалить объекты в конкретную дату
{
"ID": "expire-on-date",
"Status": "Enabled",
"Filter": {
"Prefix": "archive/2025/"
},
"Expiration": {
"Date": "2027-01-01T00:00:00.000Z"
}
}
Дата указывается в формате ISO 8601 и должна приходиться на полночь по UTC.
Удалить неактуальные версии, сохранив несколько последних
{
"ID": "keep-last-versions",
"Status": "Enabled",
"Filter": {},
"NoncurrentVersionExpiration": {
"NoncurrentDays": 30,
"NewerNoncurrentVersions": 5
}
}
Параметр NewerNoncurrentVersions оставляет указанное число самых свежих неактуальных версий независимо от их возраста — страховка на случай, если откатываться придётся на несколько шагов назад.
Убрать маркеры удаления, под которыми не осталось версий
{
"ID": "cleanup-delete-markers",
"Status": "Enabled",
"Filter": {},
"Expiration": {
"ExpiredObjectDeleteMarker": true
}
}
Отобрать объекты по тегу
{
"ID": "expire-temporary",
"Status": "Enabled",
"Filter": {
"Tag": {
"Key": "retention",
"Value": "temporary"
}
},
"Expiration": {
"Days": 14
}
}
Скомбинировать префикс и тег
Чтобы объединить несколько условий, используется блок And:
"Filter": {
"And": {
"Prefix": "reports/",
"Tags": [
{
"Key": "retention",
"Value": "temporary"
}
]
}
}
Важно! Действия AbortIncompleteMultipartUpload и ExpiredObjectDeleteMarker нельзя использовать в правиле, отфильтрованном по тегам. Для них применяйте фильтр по префиксу или пустой фильтр.
Частые ошибки
| Симптом | Причина и решение |
|---|---|
| MalformedXML в ответе | Ошибка в структуре JSON: пропущенная запятая, лишняя скобка, неверное имя поля. Проверьте файл валидатором JSON |
| Правило не срабатывает | Проверьте статус Enabled, отсутствие ведущего слеша в префиксе (logs/, а не /logs/) и то, что прошло не менее суток |
| Правило для неактуальных версий не работает | Оно действует только в бакете с включённым версионированием |
| Удалилось больше, чем ожидалось | Проверьте фильтр: пустой фильтр означает весь бакет. Новые правила имеет смысл обкатывать на тестовом префиксе |
| Объекты удалены, но объём бакета не уменьшился | В бакете с версионированием Expiration только создаёт маркеры удаления. Нужно дополнительное правило NoncurrentVersionExpiration |
Смотрите также:
- Как проверить, изменить и удалить правила жизненного цикла в AWS CLI
- Как включить версионирование в бакете через AWS CLI
к Работе с S3 RTCloud