Версионирование — режим бакета, при котором хранилище сохраняет все состояния объекта, а не только последнее. Он защищает от случайной перезаписи и удаления: вернуться к любой предыдущей версии файла можно без обращения к резервным копиям.
Ниже — как устроен механизм и что учитывать при его использовании. Практические инструкции вынесены в отдельные статьи: «Как включить версионирование через AWS CLI» и «Как включить версионирование через S3 Browser».
Как это работает
Каждая запись объекта создаёт новую версию. Версии одного объекта имеют общий ключ и различаются идентификатором VersionId, который хранилище присваивает автоматически. Обычный запрос на чтение возвращает последнюю загруженную версию — она считается текущей; к остальным версиям нужно обращаться явно, указав идентификатор.
Без версионирования повторная загрузка объекта с тем же ключом просто заменяет прежнее содержимое, и оно теряется безвозвратно.
Что даёт версионирование
- Восстановление после ошибки. Перезаписанный или удалённый по ошибке файл возвращается откатом на нужную версию — за секунды и без участия службы резервного копирования.
- История изменений. По списку версий видно, когда и в каком порядке менялся объект.
- Защита при компрометации. Если учётные данные попали к злоумышленнику и он удалил данные, они остаются в бакете.
Что происходит при удалении
Удаление объекта не приводит к физическому удалению данных: хранилище создаёт служебную запись — маркер удаления (delete marker). Он становится текущей версией объекта, поэтому объект пропадает из списка файлов, а запрос на чтение возвращает ошибку «объект не найден».
Маркер удаления не содержит данных. Если удалить его, текущей снова станет последняя версия объекта — то есть удаление обратимо. Чтобы уничтожить данные окончательно, каждую версию нужно удалять явно, по её идентификатору.
Важно! В бакете с версионированием «удалить» и «удалить навсегда» — разные операции.
Три состояния бакета
| Состояние | Поведение |
|---|---|
| Не включено | Версии не создаются, перезапись уничтожает прежнее содержимое. Исходное состояние любого нового бакета |
| Включено (Enabled) | Каждая запись создаёт новую версию, удаление создаёт маркер удаления |
| Приостановлено (Suspended) | Новые версии не создаются, но все ранее созданные продолжают храниться и остаются доступными |
Включённое версионирование нельзя отключить — его можно только приостановить. Уже созданные версии при этом сохраняются и продолжают занимать место в бакете.
О чём важно помнить
- Каждая версия тарифицируется как самостоятельный объект, поэтому бакет с частой перезаписью растёт быстрее, чем можно ожидать по числу файлов в нём. Чтобы объём не рос бесконечно, версионирование включают вместе с правилом жизненного цикла, которое удаляет неактуальные версии по истечении заданного срока (см. «Что такое жизненный цикл объектов в S3»).
- Версии не видны в обычном списке объектов. Чтобы их увидеть, нужен отдельный запрос: в AWS CLI — команда list-object-versions, в S3 Browser — вкладка Versions.
- Расхождение между числом файлов и объёмом бакета почти всегда объясняется накопленными версиями либо незавершёнными мультипартовыми загрузками.
- Версионирование не заменяет резервное копирование: оно защищает от ошибочных действий с объектами, но не от потери доступа к учётной записи и не от ошибок в самом приложении, которое пишет данные.
Смотрите также:
к Работе с S3 RTCloud