Что такое версионирование в S3

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

Ниже — как устроен механизм и что учитывать при его использовании. Практические инструкции вынесены в отдельные статьи: «Как включить версионирование через AWS CLI» и «Как включить версионирование через S3 Browser».


Как это работает

Каждая запись объекта создаёт новую версию. Версии одного объекта имеют общий ключ и различаются идентификатором VersionId, который хранилище присваивает автоматически. Обычный запрос на чтение возвращает последнюю загруженную версию — она считается текущей; к остальным версиям нужно обращаться явно, указав идентификатор.

Без версионирования повторная загрузка объекта с тем же ключом просто заменяет прежнее содержимое, и оно теряется безвозвратно.


Что даёт версионирование

  • Восстановление после ошибки. Перезаписанный или удалённый по ошибке файл возвращается откатом на нужную версию — за секунды и без участия службы резервного копирования.
  • История изменений. По списку версий видно, когда и в каком порядке менялся объект.
  • Защита при компрометации. Если учётные данные попали к злоумышленнику и он удалил данные, они остаются в бакете.

Что происходит при удалении

Удаление объекта не приводит к физическому удалению данных: хранилище создаёт служебную запись — маркер удаления (delete marker). Он становится текущей версией объекта, поэтому объект пропадает из списка файлов, а запрос на чтение возвращает ошибку «объект не найден».

Маркер удаления не содержит данных. Если удалить его, текущей снова станет последняя версия объекта — то есть удаление обратимо. Чтобы уничтожить данные окончательно, каждую версию нужно удалять явно, по её идентификатору.

Важно! В бакете с версионированием «удалить» и «удалить навсегда» — разные операции.

Три состояния бакета

Состояние Поведение
Не включено Версии не создаются, перезапись уничтожает прежнее содержимое. Исходное состояние любого нового бакета
Включено (Enabled) Каждая запись создаёт новую версию, удаление создаёт маркер удаления
Приостановлено (Suspended) Новые версии не создаются, но все ранее созданные продолжают храниться и остаются доступными

Включённое версионирование нельзя отключить — его можно только приостановить. Уже созданные версии при этом сохраняются и продолжают занимать место в бакете.


О чём важно помнить

  • Каждая версия тарифицируется как самостоятельный объект, поэтому бакет с частой перезаписью растёт быстрее, чем можно ожидать по числу файлов в нём. Чтобы объём не рос бесконечно, версионирование включают вместе с правилом жизненного цикла, которое удаляет неактуальные версии по истечении заданного срока (см. «Что такое жизненный цикл объектов в S3»).
  • Версии не видны в обычном списке объектов. Чтобы их увидеть, нужен отдельный запрос: в AWS CLI — команда list-object-versions, в S3 Browser — вкладка Versions.
  • Расхождение между числом файлов и объёмом бакета почти всегда объясняется накопленными версиями либо незавершёнными мультипартовыми загрузками.
  • Версионирование не заменяет резервное копирование: оно защищает от ошибочных действий с объектами, но не от потери доступа к учётной записи и не от ошибок в самом приложении, которое пишет данные.


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

к Работе с S3 RTCloud


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