VK Cloud logo

Восстановление удалённых объектов с помощью версионирования

С помощью сервиса VK Object Storage можно защитить данные в бакете от случайного удаления и несанкционированного изменения. Для этого используется версионирование — механизм, который сохраняет все версии объекта при его перезаписи или удалении. Если объект удален по ошибке, его можно восстановить из предыдущей версии.

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

Для примера далее используются следующие данные:

  • Имя бакета — versioning-test-bucket.
  • Ключ объекта — report.txt.
  • Имя хоста для подключения — https://hb.ru-msk.vkcloud-storage.ru (для региона Москва).

Подготовительные шаги

  1. Создайте аккаунт для сервиса VK Object Storage, если это еще не сделано:

    1. Перейдите в личный кабинет VK Cloud.

    2. Выберите проект.

    3. Перейдите в раздел Object StorageАккаунты.

    4. Нажмите кнопку Добавить аккаунт или Добавить.

    5. Задайте имя аккаунта.

    6. Нажмите кнопку Создать.

    7. В открывшемся окне скопируйте и сохраните идентификатор ключа доступа (Access Key ID) и секретный ключ (Secret Key).

  2. Убедитесь, что AWS CLI установлен и настроен для работы с созданным аккаунтом VK Object Storage.

  3. Создайте бакет с именем versioning-test-bucket.

1. Включите версионирование бакета

Включите версионирование для бакета versioning-test-bucket, выполнив команду:

aws s3api put-bucket-versioning \  --bucket versioning-test-bucket \  --versioning-configuration Status=Enabled \  --endpoint-url https://hb.ru-msk.vkcloud-storage.ru

После включения версионирования все операции загрузки, перезаписи и удаления объектов в бакете будут сохранять предыдущие версии. Каждой версии присваивается уникальный идентификатор (VersionId).

2. Загрузите тестовый объект в бакет

  1. Создайте текстовый файл report.txt и загрузите его в бакет:

    echo "Version 1" > report.txtaws s3 cp report.txt s3://versioning-test-bucket/report.txt --endpoint-url https://hb.ru-msk.vkcloud-storage.ru
  2. Перезапишите объект, загрузив новую версию файла:

    echo "Version 2" > report.txtaws s3 cp report.txt s3://versioning-test-bucket/report.txt --endpoint-url https://hb.ru-msk.vkcloud-storage.ru
  3. Проверьте, что в бакете сохранены обе версии объекта:

    aws s3api list-object-versions \--bucket versioning-test-bucket \--prefix report.txt \--endpoint-url https://hb.ru-msk.vkcloud-storage.ru

Сохраните идентификатор версии (VersionId) нужной версии объекта — он понадобится для восстановления.

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

  1. Удалите объект из бакета:

    aws s3 rm s3://versioning-test-bucket/report.txt --endpoint-url https://hb.ru-msk.vkcloud-storage.ru

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

  2. Проверьте, что маркер удаления создан:

    aws s3api list-object-versions \--bucket versioning-test-bucket \--prefix report.txt \--endpoint-url https://hb.ru-msk.vkcloud-storage.ru
  3. Убедитесь, что объект недоступен при обычном запросе:

    aws s3 ls s3://versioning-test-bucket/report.txt --endpoint-url https://hb.ru-msk.vkcloud-storage.ru

4. Восстановите удаленный объект

  1. Для восстановления объекта скопируйте нужную версию из бакета, указав ее идентификатор с помощью параметра --version-id:

    aws s3 cp s3://versioning-test-bucket/report.txt restored_report.txt \--version-id <ID_ВЕРСИИ> \--endpoint-url https://hb.ru-msk.vkcloud-storage.ru

    Здесь <ID_ВЕРСИИ> — идентификатор версии объекта, полученный из вывода команды list-object-versions.

  2. Проверьте содержимое восстановленного файла:

    cat restored_report.txt
  3. Скопируйте нужную версию обратно в бакет, чтобы восстановить объект непосредственно в бакете (сделать восстановленную версию текущей):

    aws s3 cp s3://versioning-test-bucket/report.txt s3://versioning-test-bucket/report.txt \--version-id <ID_ВЕРСИИ> \--endpoint-url https://hb.ru-msk.vkcloud-storage.ru

5. Настройте автоматическую очистку старых версий

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

  1. Создайте файл lifecycle.json с конфигурацией жизненного цикла:

    {"Rules": [    {    "ID": "Expire old objects",    "Status": "Enabled",    "Filter": {        "Prefix": ""    },    "NoncurrentVersionExpiration": {        "NoncurrentDays": 30,        "NewerNoncurrentVersions": 50    }    }]}

    Здесь:

    • NoncurrentDays — количество дней, в течение которых хранится неактуальная версия объекта, после чего эта версия удаляется.
    • NewerNoncurrentVersions — количество хранимых неактуальных версий объекта. При достижении указанного лимита, старые версии объекта будут удаляться автоматически. При использовании совместно с NoncurrentDays удаление неактуальной версии выполнится только при достижении обоих лимитов.
  2. Примените конфигурацию жизненного цикла к бакету:

    aws s3api put-bucket-lifecycle-configuration \--bucket versioning-test-bucket \--lifecycle-configuration file://lifecycle.json \--endpoint-url https://hb.ru-msk.vkcloud-storage.ru
  3. Проверьте, что конфигурация применена:

    aws s3api get-bucket-lifecycle-configuration \--bucket versioning-test-bucket \--endpoint-url https://hb.ru-msk.vkcloud-storage.ru

6. Проверьте работоспособность

  1. Убедитесь, что восстановленный объект доступен в бакете:

    aws s3 ls s3://versioning-test-bucket/report.txt --endpoint-url https://hb.ru-msk.vkcloud-storage.ru
  2. Скачайте объект и проверьте его содержимое:

    aws s3 cp s3://versioning-test-bucket/report.txt downloaded_report.txt --endpoint-url https://hb.ru-msk.vkcloud-storage.rucat downloaded_report.txt

    Содержимое файла должно соответствовать восстановленной версии.

  3. Убедитесь, что конфигурация жизненного цикла применена:

    aws s3api get-bucket-lifecycle-configuration \  --bucket versioning-test-bucket \  --endpoint-url https://hb.ru-msk.vkcloud-storage.ru

Удалите неиспользуемые ресурсы

Созданные ресурсы тарифицируются. Если они вам больше не нужны:

  1. Удалите объекты из бакета, включая все версии объектов и Delete Markers.
  2. Удалите бакет.