Как настроить правило жизненного цикла через AWS CLI

Политика жизненного цикла задаётся для бакета целиком в виде 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


Смотрите также:

к Работе с S3 RTCloud


Рейтинг@Mail.ru Яндекс.Метрика