Восстановите перезаписанный отчёт с помощью версионирования

AWSBeginner
Практиковаться сейчас

Введение

Загрузка черновика по ключу отчёта команды finance заменила бы утверждённое содержимое, которое видят читатели. Вы включите версионирование, воспроизведёте эту ошибку, восстановите утверждённое содержимое и удалите учебную историю после проверки восстановления.

Сначала выполните работу Упорядочьте документы с помощью ключей и метаданных, чтобы освоить ключи объектов, свойства, скачивание и очистку. Эта новая VM предоставляет подключение CLI и утверждённый файл с черновиком; бакет создадите вы. Используйте Terminal для команд и расположенную рядом вкладку AWS View для сравнения текущих объектов с их историей.

Связь с сертификацией

Эта лабораторная работа помогает на практике изучить следующие темы экзаменов.

Включите версионирование перед публикацией

На этом шаге вы создадите пустой бакет и включите версионирование до загрузки любого отчёта.

Перейдите в рабочий каталог с помощью cd (change directory — сменить каталог):

cd /home/labex/project

Создайте бакет отчётов с помощью mb (make bucket — создать бакет):

aws s3 mb s3://labex-report-history

Вы должны увидеть make_bucket: labex-report-history. Версионирование — настройка бакета: после её включения последующие записи по ключу создают идентификаторы версий, а не отбрасывают его прежнее сохранённое содержимое. Это полезно для восстановления после случайной перезаписи, но не предотвращает явное удаление определённой версии.

aws s3api предоставляет отдельные операции API S3. put-bucket-versioning обновляет эту настройку; --bucket определяет контейнер, а --versioning-configuration Status=Enabled запрашивает включённое состояние:

aws s3api put-bucket-versioning --bucket labex-report-history --versioning-configuration Status=Enabled

Успешное обновление не выводит тело ответа. Прочитайте конфигурацию, вместо того чтобы полагаться лишь на отсутствие вывода:

aws s3api get-bucket-versioning --bucket labex-report-history
{
    "Status": "Enabled"
}

Теперь AWS View показывает Versioning: Enabled на бакете. Он всё ещё пуст: включение версионирования не загружает отчёт и не создаёт историческую версию. Включите настройку до записи данных, которые хотите защитить.

Создайте исходную и перезаписанную версии

На этом шаге вы опубликуете утверждённый отчёт, затем перезапишете его текущее содержимое черновиком, сохранив оригинал в истории.

Изучите подготовленные файлы с помощью cat, который выводит их содержимое:

cat report-approved.txt
Monthly revenue: 42000
cat report-draft.txt
Monthly revenue: 00000

Опубликуйте утверждённый файл по ключу report.txt. Имя исходного файла и ключ объекта могут отличаться:

aws s3 cp report-approved.txt s3://labex-report-history/report.txt

В AWS View откройте report.txt и подтвердите утверждённую выручку. История содержит одну версию с пометкой Current.

Теперь воспроизведите ошибку: загрузите черновик по тому же ключу:

aws s3 cp report-draft.txt s3://labex-report-history/report.txt

Предварительный просмотр меняется на Monthly revenue: 00000. По-прежнему есть один текущий ключ объекта, но его история теперь содержит две сохранённые версии. Оба файла имеют одинаковый размер; версионирование отслеживает записи, а не определяет изменения только по размеру.

list-object-versions получает исторические записи вместе с текущей версией:

aws s3api list-object-versions --bucket labex-report-history

Массив Versions содержит две записи с ключом report.txt и разными значениями VersionId. IsLatest: true определяет черновик как текущий; более ранняя утверждённая версия имеет IsLatest: false. Идентификаторы и временные метки различаются. Обычный список объектов показывает текущие ключи, поэтому при исследовании перезаписи используйте список версий.

В официальной S3 Console переключатель Show versions показывает эти записи истории в списке объектов. Этот пример содержит другой объект и больше записей; используйте его, чтобы распознать столбец Version ID. Для этой работы вход в Console не нужен.

Официальная S3 Console с включённым Show versions

Источник: AWS Storage Blog.

Получите и опубликуйте утверждённую версию

На этом шаге вы скачаете более раннюю утверждённую версию, проверите её байты и снова сделаете это содержимое текущим, не удаляя историю.

В этот момент есть ровно две версии report.txt. В предыдущем списке найдите запись с IsLatest: false: это утверждённый оригинал. Скопируйте её VersionId.

Сохраните этот идентификатор в переменной оболочки для повторного использования. Замените PASTE_APPROVED_VERSION_ID ниже скопированным значением, сохранив кавычки. В присваивании переменной нет пробелов вокруг =:

OLD_VERSION='PASTE_APPROVED_VERSION_ID'

Проверьте значение перед использованием:

echo "$OLD_VERSION"

Вы должны увидеть идентификатор более ранней версии, а не заполнитель. $OLD_VERSION читает переменную; двойные кавычки сохраняют значение целым как один аргумент команды.

get-object скачивает тело объекта по последнему локальному пути. --version-id выбирает историческую копию вместо текущего черновика:

aws s3api get-object --bucket labex-report-history --key report.txt --version-id "$OLD_VERSION" recovered-report.txt

Вывод JSON описывает полученную копию. Прочитайте её содержимое:

cat recovered-report.txt
Monthly revenue: 42000

cmp сравнивает байты файлов. && запускает следующее сообщение только при успешном сравнении:

cmp report-approved.txt recovered-report.txt && echo 'Approved historical content verified'

Получение старой версии не делает её текущей; читатели ключа без указания версии по-прежнему получают черновик. Опубликуйте восстановленные байты по этому ключу:

aws s3 cp recovered-report.txt s3://labex-report-history/report.txt

Это создаёт третью версию с утверждённым отчётом. Старая утверждённая версия и черновик остаются для исследования. AWS View показывает утверждённое содержимое как текущее и три записи версий. Выведите историю для подтверждения:

aws s3api list-object-versions --bucket labex-report-history

Новая запись имеет IsLatest: true. Вы восстановили данные записью новой текущей версии, а не стиранием свидетельства ошибки.

Этот пример показывает восстановленный отчёт как текущий и три отдельные записи истории. Показанные идентификаторы версий — примеры из той сессии:

Восстановленный отчёт с сохранённой историей версий

Восстановите доступ после маркера удаления

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

Схема: удаление добавляет текущий маркер, а три сохранённые версии отчёта остаются. Метки v1–v3 указывают порядок записи, а не фактические идентификаторы версий.

Текущее состояние и история

В бакете с включённым версионированием запрос удаления без идентификатора версии создаёт маркер удаления. Это текущая запись истории, сообщающая, что ключ удалён; она не содержит байтов файла и не стирает старые версии. Удалите текущий ключ обычной файловой командой:

aws s3 rm s3://labex-report-history/report.txt

Теперь обычный список не показывает текущих объектов:

aws s3 ls s3://labex-report-history/

В AWS View текущий объект исчезает, а три строки Version и текущий Delete marker остаются в истории.

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

aws s3 cp s3://labex-report-history/report.txt unavailable-report.txt

Ожидается, что эта команда завершится ошибкой отсутствия объекта. Текущий маркер удаления заставляет обычное чтение вести себя так, будто объект отсутствует. Это не доказывает стирание исторических байтов.

Прочитайте полную историю:

aws s3api list-object-versions --bucket labex-report-history

Теперь ответ содержит DeleteMarkers вместе с Versions. Найдите единственную запись в DeleteMarkers и скопируйте её VersionId. Этот идентификатор определяет маркер, а не сохранённый отчёт.

Замените заполнитель ниже этим идентификатором маркера:

MARKER_VERSION='PASTE_DELETE_MARKER_ID'

Удалите именно этот маркер с помощью delete-object. Указание --version-id удаляет выбранную запись истории, а не создаёт ещё один маркер:

aws s3api delete-object --bucket labex-report-history --key report.txt --version-id "$MARKER_VERSION"

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

aws s3 cp s3://labex-report-history/report.txt accessible-report.txt
cmp report-approved.txt accessible-report.txt && echo 'Current report accessible again'

Сравнение успешно. AWS View снова показывает report.txt с утверждённым содержимым и тремя версиями. Удаление маркера восстанавливает доступ; постоянное удаление версии данных вместо этого стёрло бы конкретную копию.

Удалите исторические версии и бакет

На этом шаге вы удалите все версии данных работы перед удалением пустого бакета.

История версий занимает место, даже когда обычный список объектов пуст. Обычный aws s3 rm создал бы ещё один маркер удаления, поэтому его недостаточно для освобождения бакета с версиями. Маркер предыдущего шага уже удалён; три версии данных остаются.

Выведите историю перед постоянной очисткой:

aws s3api list-object-versions --bucket labex-report-history

Вы должны увидеть три записи в Versions и отсутствие DeleteMarkers. Все записи принадлежат этому временному упражнению с отчётом.

Все три записи относятся к report.txt. Вы уже использовали delete-object --version-id для удаления маркера; та же операция может навсегда удалить версию данных.

Скопируйте один VersionId из списка и замените заполнитель ниже. Запустите эту команду по одному разу для каждого из трёх разных идентификаторов. Постоянное удаление нельзя отменить, поэтому каждый раз проверяйте бакет, ключ и идентификатор:

aws s3api delete-object --bucket labex-report-history --key report.txt --version-id 'PASTE_VERSION_ID'

Успешный ответ идентифицирует удалённую версию. Идентификатор версии выбирает одну историческую копию; он не удаляет все версии ключа. После удаления всех трёх подтвердите, что версии и маркеры не остались:

aws s3api list-object-versions --bucket labex-report-history

Успешный ответ не содержит записей Versions или DeleteMarkers. Теперь удалите пустой бакет с помощью rb:

aws s3 rb s3://labex-report-history

Вывод — remove_bucket: labex-report-history. Подтвердите, что хранилище по-прежнему отвечает:

aws s3 ls

Бакетов не осталось, и AWS View показывает No buckets. Локальные файлы отчётов остаются доступны; удалены только ресурсы S3 этой работы и их история.

Резюме

Вы включили версионирование бакета перед публикацией, различили текущий ключ и его исторические идентификаторы версий и восстановили перезаписанный отчёт, получив прежнюю версию и опубликовав её проверенные байты. Затем вы создали и удалили маркер удаления, чтобы восстановить обычный доступ без загрузки ещё одной версии.

Версионирование сохраняет историю; оно не делает явное удаление версии обратимым. В завершение вы изучили и навсегда удалили все версии работы, подтвердили отсутствие маркеров и удалили пустой бакет.