Версионирование в S3 позволяет сохранять все изменения объектов, загруженных в бакет. Оно помогает защитить данные от случайного удаления или перезаписи, а также восстановить предыдущие версии объектов в случае необходимости.
Версионирование можно включить с помощью различных клиентов, таких как AWS CLI, S3 Browser и других. В этой статье мы рассмотрим работу с версиями на примере AWS CLI.
Чтобы включить версионирование в S3-бакете, выполните команду:
aws s3api put-bucket-versioning --bucket <имя_бакета> --versioning-configuration Status=Enabled --endpoint-url https://s3.timeweb.cloud
Проверить, что версионирование включено, можно с помощью команды:
aws s3api get-bucket-versioning --bucket <имя_бакета> --endpoint-url https://s3.timeweb.cloud
Ожидаемый результат:
{
"Status": "Enabled",
"MFADelete": "Disabled"
}
Разберем принцип работы версионирования на примере.
Создадим тестовый файл:
echo "Версия 1" > testfile.txt
Загрузим его в бакет:
aws s3 cp testfile.txt s3://<имя_бакета>/ --endpoint-url https://s3.timeweb.cloud
Обновим файл:
echo "Версия 2" > testfile.txt
Снова загрузим его:
aws s3 cp testfile.txt s3://<имя_бакета>/ --endpoint-url https://s3.timeweb.cloud
Теперь у файла есть несколько версий. Проверим их:
aws s3api list-object-versions --bucket <имя_бакета> --prefix testfile.txt --endpoint-url https://s3.timeweb.cloud
Пример результата:
{
"Versions": [
{
"Key": "testfile.txt",
"VersionId": "S7hpDH6F0RYfubNoTjin6hpBu5ewDj.",
"IsLatest": true
},
{
"Key": "testfile.txt",
"VersionId": "pdFehsuCbaPz2hNh4b9DBndfEwzjTfH",
"IsLatest": false
}
]
}
Важные нюансы:
Для управления версиями объектов в S3 доступны несколько команд.
Чтобы просмотреть все версии конкретного объекта в бакете, используйте команду:
aws s3api list-object-versions --bucket <имя_бакета> --prefix <имя_объекта> --endpoint-url https://s3.timeweb.cloud
Вывести список всех объектов в бакете вместе с их версиями можно так:
aws s3api list-object-versions --bucket <имя_бакета> --query 'Versions[*].[Key, VersionId, Size]' --endpoint-url https://s3.timeweb.cloud
Если нужно скачать конкретную версию объекта, выполните команду:
aws s3api get-object --bucket <имя_бакета> \
--key testfile.txt \
--version-id pdFehsuCbaPz2hNh4b9DBndfEwzjTfH \
testlocalfile.txt \
--endpoint-url https://s3.timeweb.cloud
Где:
--key
— имя объекта в бакете.--version-id
— идентификатор версии (получается из list-object-versions
).testlocalfile.txt
— имя файла, в который будет сохранена скачанная версия.Если объект был обновлён или удалён, можно восстановить его прежнюю версию, скопировав её поверх текущей:
aws s3api copy-object --bucket <имя_бакета> \
--key testfile.txt \
--copy-source <имя_бакета>/<имя_объекта>?versionId=<id_версии> \
--endpoint-url https://s3.timeweb.cloud
Где:
<имя_бакета>/<имя_объекта>
— полный путь к объекту в бакете.?versionId=<id_версии>
— версия, которую необходимо восстановить.После выполнения команды в бакете появится новая версия объекта, которая идентична восстановленной.
Чтобы удалить конкретную версию объекта, выполните команду:
aws s3api delete-object --bucket <имя_бакета> --key <имя_объекта> --version-id S7hpDH6F0RYfubNoTjin6hpBu5ewDj. --endpoint-url https://s3.timeweb.cloud
Где --version-id
— ID версии объекта, которую необходимо удалить.
Чтобы старые версии файлов не накапливались, можно настроить жизненный цикл объектов.
Создадим файл lifecycle.json
:
{
"Rules": [
{
"ID": "DeleteOldVersions",
"Status": "Enabled",
"Filter": {},
"NoncurrentVersionExpiration": {
"NoncurrentDays": 30
}
}
]
}
Это правило удалит версии файлов, старше 30 дней. Текущие версии останутся нетронутыми.
Применим политики жизненного цикла:
aws s3api put-bucket-lifecycle-configuration --bucket <имя_бакета> --lifecycle-configuration file://lifecycle.json --endpoint-url https://s3.timeweb.cloud
Проверим, что политика применилась:
aws s3api get-bucket-lifecycle-configuration --bucket <имя_бакета> --endpoint-url https://s3.timeweb.cloud