Логика удаления в объектном хранилище зависит от одного условия — включено ли версионирование бакета. Один и тот же вызов удаления в бакете без версионирования уничтожает данные, а в бакете с версионированием лишь прячет объект. Ниже разобраны оба случая и все связанные операции.
Главное правило. Окончательно данные удаляет только команда, в которой явно указан идентификатор версии --version-id. Любое удаление без указания версии в бакете с версионированием обратимо.
Случай 1. Бакет без версионирования
Здесь всё просто и необратимо. У объекта существует ровно одно состояние — последнее записанное.
Команда aws s3 rm или delete-object без указания версии удаляет объект физически. Восстановить его штатными средствами хранилища нельзя — корзины в S3 нет.
aws s3 rm s3://<ИМЯ_БАКЕТА>/report.pdf \
--profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru
Данные исчезают сразу. Если такой объект был важен, единственная защита — заранее включённое версионирование или отдельная резервная копия.
Случай 2. Бакет с версионированием
Здесь у объекта есть история версий, и поведение удаления меняется принципиально. Возможны два разных действия.
Мягкое удаление — создаётся маркер удаления
Когда вы удаляете объект без указания версии, хранилище не трогает данные. Оно добавляет поверх объекта служебную запись — маркер удаления (delete marker). Что происходит:
- маркер становится текущей версией объекта;
- объект пропадает из обычного списка файлов;
- запрос на чтение возвращает ошибку NoSuchKey («объект не найден»);
- все прежние версии остаются в бакете и продолжают занимать место.
aws s3 rm s3://<ИМЯ_БАКЕТА>/report.pdf \
--profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru
Данные не удалены — объект лишь скрыт маркером. Это удаление обратимо.
Жёсткое удаление — уничтожается конкретная версия
Когда вы удаляете объект с указанием версии через --version-id, уничтожается именно эта версия, и восстановить её невозможно. Маркер удаления при этом не создаётся.
aws s3api delete-object \
--bucket <ИМЯ_БАКЕТА> \
--key report.pdf \
--version-id <ID_ВЕРСИИ> \
--profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru
Важно! Эта операция необратима. Чтобы полностью стереть объект со всей историей, нужно удалить по идентификатору каждую его версию и все маркеры удаления.
Что такое маркер удаления
Маркер удаления — это пустая версия объекта без содержимого. У него есть собственный VersionId, но нет данных и размера. Его единственная роль — сделать так, чтобы объект выглядел удалённым, не уничтожая его версии.
В выводе list-object-versions маркеры лежат в отдельном массиве DeleteMarkers, а сами версии — в массиве Versions. Их легко отличить.
Как восстановить объект после мягкого удаления
Восстановление сводится к тому, чтобы убрать маркер удаления. Как только он снят, текущей снова становится последняя реальная версия, и объект возвращается в список файлов.
Шаг 1. Найдите маркер удаления
aws s3api list-object-versions \
--bucket <ИМЯ_БАКЕТА> \
--prefix report.pdf \
--query "DeleteMarkers[*].[Key, VersionId, IsLatest]" \
--profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru
Шаг 2. Удалите маркер по его идентификатору
aws s3api delete-object \
--bucket <ИМЯ_БАКЕТА> \
--key report.pdf \
--version-id <ID_МАРКЕРА> \
--profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru
После этого объект снова доступен для чтения и виден в обычном списке.
Не перепутайте. Здесь --version-id указывает на маркер удаления, а не на версию с данными. Удаление маркера безопасно и обратимо; удаление версии с данными — окончательно.
Сводная таблица
| Операция | Версионирование | Что происходит | Обратимо |
|---|---|---|---|
| s3 rm без версии | Выключено | Данные удаляются физически | Нет |
| s3 rm без версии | Включено | Создаётся маркер удаления, объект скрыт | Да |
| delete-object --version-id на версию | Включено | Уничтожается конкретная версия | Нет |
| delete-object --version-id на маркер | Включено | Маркер снят, объект восстановлен | — |
| s3 rb --force | Выключено | Удаляются все объекты и бакет | Нет |
Короткие выводы
- Без версионирования любое удаление окончательно.
- С версионированием обычное удаление всегда обратимо — оно только вешает маркер.
- Необратимо удаляет данные лишь команда с --version-id, указывающим на версию с содержимым.
- Чтобы освободить место в бакете с версионированием, мягкого удаления недостаточно — нужно убирать старые версии вручную или правилом жизненного цикла.
Смотрите также:
- Как включить версионирование в бакете через AWS CLI
- Как включить версионирование в бакете через S3 Browser
к Работе с S3 RTCloud