Удаление объектов в S3: маркеры удаления и версии

Логика удаления в объектном хранилище зависит от одного условия — включено ли версионирование бакета. Один и тот же вызов удаления в бакете без версионирования уничтожает данные, а в бакете с версионированием лишь прячет объект. Ниже разобраны оба случая и все связанные операции.

Главное правило. Окончательно данные удаляет только команда, в которой явно указан идентификатор версии --version-id. Любое удаление без указания версии в бакете с версионированием обратимо.


Случай 1. Бакет без версионирования

Здесь всё просто и необратимо. У объекта существует ровно одно состояние — последнее записанное.

Команда aws s3 rm или delete-object без указания версии удаляет объект физически. Восстановить его штатными средствами хранилища нельзя — корзины в S3 нет.

aws s3 rm s3://<ИМЯ_БАКЕТА>/report.pdf \
  --profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru

Данные исчезают сразу. Если такой объект был важен, единственная защита — заранее включённое версионирование или отдельная резервная копия.


Случай 2. Бакет с версионированием

Здесь у объекта есть история версий, и поведение удаления меняется принципиально. Возможны два разных действия.

Мягкое удаление — создаётся маркер удаления

Когда вы удаляете объект без указания версии, хранилище не трогает данные. Оно добавляет поверх объекта служебную запись — маркер удаления (delete marker). Что происходит:

  • маркер становится текущей версией объекта;
  • объект пропадает из обычного списка файлов;
  • запрос на чтение возвращает ошибку NoSuchKey («объект не найден»);
  • все прежние версии остаются в бакете и продолжают занимать место.
aws s3 rm s3://<ИМЯ_БАКЕТА>/report.pdf \
  --profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru

Данные не удалены — объект лишь скрыт маркером. Это удаление обратимо.

Жёсткое удаление — уничтожается конкретная версия

Когда вы удаляете объект с указанием версии через --version-id, уничтожается именно эта версия, и восстановить её невозможно. Маркер удаления при этом не создаётся.

aws s3api delete-object \
  --bucket <ИМЯ_БАКЕТА> \
  --key report.pdf \
  --version-id <ID_ВЕРСИИ> \
  --profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru
Важно! Эта операция необратима. Чтобы полностью стереть объект со всей историей, нужно удалить по идентификатору каждую его версию и все маркеры удаления.

Что такое маркер удаления

Маркер удаления — это пустая версия объекта без содержимого. У него есть собственный VersionId, но нет данных и размера. Его единственная роль — сделать так, чтобы объект выглядел удалённым, не уничтожая его версии.

В выводе list-object-versions маркеры лежат в отдельном массиве DeleteMarkers, а сами версии — в массиве Versions. Их легко отличить.


Как восстановить объект после мягкого удаления

Восстановление сводится к тому, чтобы убрать маркер удаления. Как только он снят, текущей снова становится последняя реальная версия, и объект возвращается в список файлов.

Шаг 1. Найдите маркер удаления

aws s3api list-object-versions \
  --bucket <ИМЯ_БАКЕТА> \
  --prefix report.pdf \
  --query "DeleteMarkers[*].[Key, VersionId, IsLatest]" \
  --profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru

Шаг 2. Удалите маркер по его идентификатору

aws s3api delete-object \
  --bucket <ИМЯ_БАКЕТА> \
  --key report.pdf \
  --version-id <ID_МАРКЕРА> \
  --profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru

После этого объект снова доступен для чтения и виден в обычном списке.

Не перепутайте. Здесь --version-id указывает на маркер удаления, а не на версию с данными. Удаление маркера безопасно и обратимо; удаление версии с данными — окончательно.


Сводная таблица

Операция Версионирование Что происходит Обратимо
s3 rm без версии Выключено Данные удаляются физически Нет
s3 rm без версии Включено Создаётся маркер удаления, объект скрыт Да
delete-object --version-id на версию Включено Уничтожается конкретная версия Нет
delete-object --version-id на маркер Включено Маркер снят, объект восстановлен
s3 rb --force Выключено Удаляются все объекты и бакет Нет

Короткие выводы

  • Без версионирования любое удаление окончательно.
  • С версионированием обычное удаление всегда обратимо — оно только вешает маркер.
  • Необратимо удаляет данные лишь команда с --version-id, указывающим на версию с содержимым.
  • Чтобы освободить место в бакете с версионированием, мягкого удаления недостаточно — нужно убирать старые версии вручную или правилом жизненного цикла.


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

к Работе с S3 RTCloud


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