Версионирование — инструмент для хранения нескольких версий объекта. Управление версионированием происходит на уровне бакета: настройки применяются ко всем его объектам.
К версиям объектов применяются стандартные правила тарификации.
Версионирование защищает данные от случайного удаления и перезаписи. Если версионирование в бакете включено:
Все версии объектов сохраняются в виде отдельных копий: если загрузить в бакет объект с ключом (названием), присвоенным уже существующему объекту, для объекта будет сохранена новая версия. Исходная версия не перезапишется и ее можно будет восстановить.
Стандартный запрос на удаление объекта не удаляет данные безвозвратно, а помечает объект как удаленный с помощью delete-маркера. При этом любую версию объекта можно восстановить или удалить безвозвратно.
Object Storage позволяет автоматизировать удаление ненужных версий с помощью политик жизненного цикла объекта.
Управлять версионированием в Object Storage можно через личный кабинет, AWS S3 API и с помощью сторонних клиентов. Подробнее — в разделе «Работа с версионированием».
Версионирование бакета может быть в одном из следующих состояний:
выключено;
включено;
приостановлено.
По умолчанию версионирование в бакете выключено. После включения версионирование нельзя выключить, но можно приостановить, если в бакете выключена блокировка (Object Lock).
При сохранении объекта в бакет каждой версии объекта присваиваются служебные параметры versionId и isLatest. Управлять этими параметрами вручную нельзя.
Параметр isLatest позволяет маркировать текущую версию объекта и принимает значения:
true — для текущей версии объекта;
false — для всех остальных версий.
Параметр versionId служит уникальным идентификатором версии. Значение параметра зависит от состояния версионирования бакета:
Если версионирование выключено или приостановлено, новые объекты или новые версии существующих объектов сохраняются с параметром versionId, равным null.
Если версионирование включено, каждой версии присваивается уникальный versionId, не равный null.
Object Storage позволяет просматривать параметры всех версий объектов в бакете.
Delete-маркер позволяет пометить объект как удаленный и скрыть его, но не удалять данные физически. Delete-маркер хранится в Object Storage как особый тип объекта: он является служебной отметкой и не хранит данные версии объекта.
Object Storage автоматически создает delete-маркер, если соблюдены следующие условия:
версионирование в бакете включено или приостановлено;
в запросе на удаление объекта не указана версия объекта.
Аналогично обычной версии, delete-маркеру при создании присваиваются параметры:
key — соответствует ключу (названию) удаляемого объекта;
versionId — равен null, если версионирование приостановлено, и не равен null, если версионирование включено;
isLatest — равен true: маркер становится текущей версией объекта.
Если текущая версия объекта — delete-маркер, объект не отображается при выполнении операций ListObjectsV2, GetObject, HeadObject и пр.
При работе в личном кабинете объекты, помеченные как удаленные, отображаются на вкладке Версии и не отображаются на вкладке Объекты. Delete-маркер показан как версия с тегом Удаленный объект.
Объект, помеченный как удаленный, можно восстановить — сделать текущей одну из его версий, не являющуюся delete-маркером.
Если текущая версия объекта — delete-маркер, это не блокирует:
загрузку новых версий (PutObject) с таким же ключом (названием);
повторное удаление объекта (DeleteObject) — функциональность доступна при работе с хранилищем через AWS S3 API и сторонние клиенты.
Такие запросы будут завершаться без ошибки. Результат их выполнения зависит от состояния версионирования бакета.
В таблице ниже описано поведение хранилища при разных состояниях версионирования.
Действие с хранилищем | Версионирование выключено | Версионирование включено | Версионирование приостановлено |
|---|---|---|---|
Загрузка объекта с ключом, присвоенным существующему объекту | Существующий объект перезаписывается, восстановить его невозможно. Единственная копия объекта отображается как текущая. versionId объекта равен null. | Сохраняется новая версия объекта с уникальным versionId, не равным null. Новая версия становится текущей. Существующие версии объекта и delete-маркеры не изменяются и доступны в истории версий. |
|
Удаление объекта без указания версии | Объект удаляется безвозвратно. | Для объекта создается delete-маркер с уникальным versionId, не равным null. Delete-маркер становится текущей версией. Существующие версии объекта и delete-маркеры не изменяются и доступны в истории версий. |
|
Удаление объекта с указанием версии | Единственная версия объекта удаляется безвозвратно. | Версия или delete-маркер удаляется безвозвратно. Другие версии объекта и delete-маркеры не изменяются и доступны в истории версий. | Версия или delete-маркер удаляется безвозвратно. Другие версии объекта и delete-маркеры не изменяются и доступны в истории версий. |
Блокировка недоступна. | Можно включить блокировку. | Если блокировка включена, версионирование нельзя приостановить. Статус версионирования не влияет на заблокированные объекты. |