Миран — База знанийМиран — База знаний

Версионирование в S3 хранилище

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

Что происходит при включении версионирования

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

При включенном версионировании: вместо перезаписи S3 создаёт новую версию с уникальным VersionId, а старая остается в хранилище; по умолчанию при чтении без versionId возвращается самая новая версия.

Версионирование включается на уровне бакета, и после этого поведение распространяется на все объекты внутри него.

Как используются версии

Каждый объект имеет VersionId; в бакете с версионированием варианты объекта различаются именно этим идентификатором.

Можно явно обращаться к конкретной версии, указав versionId в запросе GET или HEAD, а также копировать, загружать или скачивать нужную версию через API/CLI/SDK/панель.

Версии нельзя “отредактировать на месте” — каждая попытка изменить объект создает новую версию, а старые хранятся как отдельные объекты.

Удаление и маркеры удаления

При удалении объекта в бакете с версионированием создается так называемый delete‑маркер — особая версия-флаг, которая скрывает объект, но не удаляет старые версии данных.

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

Зачем это нужно

Защита от случайного удаления или перезаписи: всегда можно восстановить нужную версию файла.

Откат изменений: если приложение ошибочно перезаписало конфиг, ресурс или бэкап, можно вернуться к предыдущей версии.

Аудит и история: в некоторых сценариях полезно иметь полную “историю” объекта за период.

Как включить версионирование

Версионирование можно включить через aws s3api или в некоторых клиентах

Включение версионирования

aws s3api put-bucket-versioning \
  --bucket <имя-бакета> \
  --versioning-configuration Status=Enabled \
  --endpoint-url https://s3.cloud.miran.ru

Пример:

aws s3api put-bucket-versioning \
  --bucket test \
  --versioning-configuration Status=Enabled \
  --endpoint-url https://s3.cloud.miran.ru

Проверка статуса версионирования

aws s3api get-bucket-versioning \
  --bucket test \
  --endpoint-url https://s3.cloud.miran.ru

Если выключено (Suspended) или версионирование не настроено, браузер Status может быть None.

Как выключить версионирование

Приостановить версионирование (новые объекты не будут получать версии, старые остаются):

aws s3api put-bucket-versioning \
  --bucket test \
  --versioning-configuration Status=Suspended \
  --endpoint-url https://s3.cloud.miran.ru

Как вернуться к предыдущей версии объекта

Для этого обычно используют последовательность: список версий → определить VersionId нужной версии → скопировать её поверх текущей версии.

Получить список версий объекта:

aws s3api list-object-versions \
  --bucket test \
  --prefix "path/to/your-file.txt" \
  --endpoint-url https://s3.cloud.miran.ru

В ответе выберите VersionId предыдущей версии, например:

"Versions": [
  {
    "ETag": "...",
    "Size": 1024,
    "Key": "path/to/your-file.txt",
    "VersionId": "F_w3qXRNiJHq.NJaA9ULJr9qtfQq.FVl",
    "IsLatest": true
  },
  {
    "ETag": "...",
    "Size": 512,
    "Key": "path/to/your-file.txt",
    "VersionId": "UQqKjJ0.dfZefu2v2jiZDoQ.hCCW2.SH",
    "IsLatest": false
  }
]

Восстановить предыдущую версию, скопировав её на текущий ключ:

aws s3api copy-object \
  --bucket test \
  --key path/to/your-file.txt \
  --copy-source "test/path/to/your-file.txt?versionId=UQqKjJ0.dfZefu2v2jiZDoQ.hCCW2.SH" \
  --endpoint-url https://s3.cloud.miran.ru

После этого your-file.txt будет содержать содержимое предыдущей версии, а новая версия станет самой актуальной.

Скачать конкретную версию вместо восстановления:

aws s3api get-object \
  --bucket test \
  --key path/to/your-file.txt \
  --version-id "UQqKjJ0.dfZefu2v2jiZDoQ.hCCW2.SH" local-file.txt \
  --endpoint-url https://s3.cloud.miran.ru

Как восстановить удаленный объект

Получить список версий объекта report.pdf:

aws s3api list-object-versions \
  --bucket test \
  --prefix "docs/report.pdf" \
  --endpoint-url https://s3.cloud.miran.ru

Если в ответе есть Versions с IsLatest: false или DeleteMarker, значит у файла была другая версия до удаления, и её можно восстановить.

Восстановить последнюю сохранённую версию. Из вывода list-object-versions найдите VersionId не текущей версии, а той, что была до удаления. Например:

"Versions": [
  {
    "Key": "docs/report.pdf",
    "VersionId": "ISUI_2jsnaifabwqj32i4jn",
    "IsLatest": false
  },
  {
    "Key": "docs/report.pdf",
    "VersionId": "UQqKjJ0.dfZefu2v2jiZDoQ.hCCW2.SH",
    "IsLatest": true,
    "DeleteMarker": true
  }
]

Здесь актуальной версии соответствует DeleteMarker, а ISUI_2jsnaifabwqj32i4jn — последняя реальная версия файла.

Восстановите её, скопировав поверх текущего ключа:

aws s3api copy-object \
  --bucket test \
  --key docs/report.pdf \
  --copy-source "test/docs/report.pdf?versionId=ISUI_2jsnaifabwqj32i4jn" \
  --endpoint-url https://s3.cloud.miran.ru

После этого docs/report.pdf снова будет доступен, а IsLatest станет на эту версию.

Если DeleteMarker остаётся и мешает, его можно удалить явно, указав VersionId маркера:

aws s3api delete-object \
  --bucket test \
  --key docs/report.pdf \
  --version-id UQqKjJ0.dfZefu2v2jiZDoQ.hCCW2.SH \
  --endpoint-url https://s3.cloud.miran.ru

Так бакет будет выглядеть «чисто» — файл снова будет доступен без флагов удаления.

Похожие статьи

CORS: зачем нужно, примеры настройки, частые ошибки
Описание
Версионирование в S3 хранилище | Миран — База знаний