Как управлять версиями объектов через AWS CLI

После включения версионирования у объектов появляется история: её можно просматривать, скачивать отдельные версии, восстанавливать удалённые объекты и удалять версии окончательно. Ниже — команды для всех этих операций. Если версионирование ещё не включено, начните со статьи «Как включить версионирование в бакете через AWS CLI».

Во всех примерах используется профиль rtcloud и эндпоинт https://s3-msk2.rtcloud.ru — подставляйте свои значения.


Почему обычный листинг не показывает версии

Стандартная команда просмотра содержимого выводит только актуальные версии объектов:

aws s3 ls s3://<ИМЯ_БАКЕТА> --recursive --human-readable --summarize \
  --profile rtcloud --endpoint-url https://s3-msk2.rtcloud.ru

Параметр --recursive обходит все префиксы внутри бакета, --human-readable выводит размеры в удобных единицах, --summarize добавляет в конец итоговое число объектов и суммарный объём.

Чтобы увидеть версии и маркеры удаления, нужен отдельный вызов S3 API — list-object-versions. Его ответ содержит два массива: Versions — версии объектов и DeleteMarkers — маркеры удаления.


Просмотр версий

Версии конкретного объекта

aws s3api list-object-versions \
  --bucket <ИМЯ_БАКЕТА> \
  --prefix <ИМЯ_ОБЪЕКТА> \
  --profile rtcloud \
  --endpoint-url https://s3-msk2.rtcloud.ru

Все объекты бакета с их версиями

Чтобы вывод был компактнее, ограничьте его нужными полями:

aws s3api list-object-versions \
  --bucket <ИМЯ_БАКЕТА> \
  --query "Versions[*].[Key, VersionId, Size, IsLatest]" \
  --output table \
  --profile rtcloud \
  --endpoint-url https://s3-msk2.rtcloud.ru

На больших бакетах ограничивайте выборку префиксом — иначе запрос вернёт десятки тысяч записей:

aws s3api list-object-versions \
  --bucket <ИМЯ_БАКЕТА> \
  --prefix documents/ \
  --profile rtcloud \
  --endpoint-url https://s3-msk2.rtcloud.ru

Скачивание определённой версии

aws s3api get-object \
  --bucket <ИМЯ_БАКЕТА> \
  --key testfile.txt \
  --version-id pdFehsuCbaPz2hNh4b9DBndfEwzjTfH \
  testlocalfile.txt \
  --profile rtcloud \
  --endpoint-url https://s3-msk2.rtcloud.ru

Где:

  • --key — имя объекта в бакете;
  • --version-id — идентификатор версии, полученный из list-object-versions;
  • testlocalfile.txt — имя локального файла, в который будет сохранено содержимое.

Восстановление предыдущей версии

Отдельной команды «откатить объект» в S3 нет. Восстановление выполняется копированием нужной версии поверх текущей: создаётся новая версия с прежним содержимым, а история остаётся полной.

aws s3api copy-object \
  --bucket <ИМЯ_БАКЕТА> \
  --key testfile.txt \
  --copy-source "<ИМЯ_БАКЕТА>/testfile.txt?versionId=<ID_ВЕРСИИ>" \
  --profile rtcloud \
  --endpoint-url https://s3-msk2.rtcloud.ru

Значение --copy-source заключайте в кавычки: символ ? интерпретируется командной оболочкой.


Восстановление удалённого объекта

Если объект был удалён обычной командой, поверх него стоит маркер удаления. Найдите его в массиве DeleteMarkers:

aws s3api list-object-versions \
  --bucket <ИМЯ_БАКЕТА> \
  --prefix testfile.txt \
  --query "DeleteMarkers[*].[Key, VersionId, IsLatest]" \
  --profile rtcloud \
  --endpoint-url https://s3-msk2.rtcloud.ru

И удалите маркер по его идентификатору:

aws s3api delete-object \
  --bucket <ИМЯ_БАКЕТА> \
  --key testfile.txt \
  --version-id <ID_МАРКЕРА_УДАЛЕНИЯ> \
  --profile rtcloud \
  --endpoint-url https://s3-msk2.rtcloud.ru

После этого текущей снова станет последняя версия объекта, и он вернётся в обычный листинг.


Удаление конкретной версии

Та же команда delete-object, но с идентификатором версии, а не маркера, уничтожает данные:

aws s3api delete-object \
  --bucket <ИМЯ_БАКЕТА> \
  --key testfile.txt \
  --version-id S7hpDH6F0RYfubNoTjin6hpBu5ewDj \
  --profile rtcloud \
  --endpoint-url https://s3-msk2.rtcloud.ru
Важно! Удаление версии по идентификатору необратимо: восстановить данные после этой операции невозможно. Перед массовой очисткой убедитесь, что удаляете именно те версии, которые больше не нужны.

Сколько места занимают версии

Обычный подсчёт размера бакета учитывает только актуальные версии. Полный объём с учётом истории можно оценить так:

aws s3api list-object-versions \
  --bucket <ИМЯ_БАКЕТА> \
  --query "sum(Versions[].Size)" \
  --profile rtcloud \
  --endpoint-url https://s3-msk2.rtcloud.ru

Если разница с обычным листингом оказалась значительной, разумнее не удалять версии вручную, а настроить автоматическую очистку правилом жизненного цикла (см. «Как настроить правило жизненного цикла через AWS CLI»).


Смотрите также:

к Работе с S3 RTCloud


Рейтинг@Mail.ru Яндекс.Метрика