<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Публичное облако на базе VMware с управлением через vCloud Director
На главную
25eb9e0a-a5a8-472a-ace7-940b8bd2adf0
Облачные сервисы

Object Lock в S3

Object Lock используется для защиты объектов в S3 от удаления и изменений в течение заданного времени. Эта функция гарантирует неизменность данных на весь период хранения. Object Lock особенно полезен при работе с важными архивами, резервными копиями и другой критичной информацией, которую нужно защитить от случайных или намеренных действий. 

Создание бакета с Object Lock

Включить Object Lock можно только при создании бакета. Включение этой функции пока недоступно в панели управления, поэтому бакет необходимо создать с помощью сторонних клиентов или утилит. Рассмотрим пример создания бакета через AWS CLI.

Создадим бакет:

aws s3api create-bucket \
	--bucket object-lock-bucket \
	--endpoint-url https://s3.timeweb.cloud \
	--object-lock-enabled-for-bucket

Также можем создать бакет с холодным классом хранения:

aws s3api create-bucket \
	--bucket object-lock-bucket \
	--endpoint-url https://s3.timeweb.cloud \
	--create-bucket-configuration LocationConstraint=ru:ru-1-cold \
	--object-lock-enabled-for-bucket

Указать объем бакета при создании невозможно. При создании бакета через сторонние клиенты всегда устанавливается минимально возможный объем — 10 ГБ для стандартного класса хранения и 1 ГБ для холодного класса. После создания бакета объем можно увеличить через панель управления

Проверим, что Object Lock активен:

aws s3api get-object-lock-configuration \
  --bucket object-lock-bucket \
  --endpoint-url https://s3.timeweb.cloud

Ответ будет таким:

{
	"ObjectLockConfiguration": {
    	"ObjectLockEnabled": "Enabled"
	}
}

Object Lock работает только с включенным версионированием. Убедимся, что оно активно:

aws s3api get-bucket-versioning \
  --bucket object-lock-bucket \
  --endpoint-url https://s3.timeweb.cloud

В ответе отобразится статус версионирования:

{
	"Status": "Enabled",
	"MFADelete": "Disabled"
}

Режимы Object Lock

В Object Lock доступны два режима блокировки объектов:

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

GOVERNANCE — гибкий режим защиты. Объекты защищены от удаления и изменений, но пользователи с правами BypassGovernanceRetention могут удалить данные до истечения срока блокировки. Подходит для защиты от случайных удалений.

Режим блокировки указывается для каждого загружаемого объекта.

В текущей реализации кластера S3 создаётся только один пользователь с полными правами, включая BypassGovernanceRetention. Поэтому при использовании режима GOVERNANCE пользователь всегда сможет удалить объект с обходом блокировки.

Использование Object Lock

Рассмотрим примеры работы режимов COMPLIANCE и GOVERNANCE.

COMPLIANCE

Загрузим файл с блокировкой на 30 дней:

aws s3api put-object \
	--bucket object-lock-bucket \
	--key compliance-file.txt \
	--body compliance-file.txt \
	--object-lock-mode COMPLIANCE \
	--object-lock-retain-until-date "$(date -d '+30 days' --utc +%Y-%m-%dT%H:%M:%SZ)" \
	--endpoint-url https://s3.timeweb.cloud

Описание параметров:

  • --bucket — имя бакета, в который загружается объект.

  • --key — имя (путь) объекта в бакете.

  • --body — путь к файлу, который загружается.

  • --object-lock-mode — режим блокировки.

  • --object-lock-retain-until-date — дата и время окончания блокировки в формате YYYY-MM-DDTHH:MM:SSZ. До этой даты объект защищён от удаления.

Убедимся, что защита применена:

aws s3api get-object-retention \
  --bucket object-lock-bucket \
  --key compliance-file.txt \
  --endpoint-url https://s3.timeweb.cloud

В ответ получим подобный вывод:

{
	"Retention": {
    	"Mode": "COMPLIANCE",
    	"RetainUntilDate": "2025-04-04T10:02:21.000000000Z"
	}
}

Попробуем удалить объект:

aws s3api delete-object \
  --bucket object-lock-bucket \
  --key compliance-file.txt \
  --endpoint-url https://s3.timeweb.cloud

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

Проверим версии объекта:

aws s3api list-object-versions \
  --bucket object-lock-bucket \
  --prefix compliance-file.txt \
  --endpoint-url https://s3.timeweb.cloud

Мы увидим, что версия сохранена и для нее создан маркер.

Selection 189

Удаленную версию можно восстановить по инструкции.

Удаление конкретной версии с активной блокировкой будет невозможно:

aws s3api delete-object \
  --bucket object-lock-bucket \
  --key compliance-file.txt \
  --version-id <VersionId_объекта> \
  --endpoint-url https://s3.timeweb.cloud

До истечения срока блокировки команда вернет ошибку:

An error occurred (AccessDenied) when calling the DeleteObject operation: forbidden by object lock

GOVERNANCE

Загрузим файл с блокировкой на 30 дней:

aws s3api put-object \
	--bucket object-lock-bucket \
	--key governance-file.txt \
	--body governance-file.txt \
	--object-lock-mode GOVERNANCE \
	--object-lock-retain-until-date "$(date -d '+30 days' --utc +%Y-%m-%dT%H:%M:%SZ)" \
	--endpoint-url https://s3.timeweb.cloud

Описание параметров:

  • --bucket — имя бакета, в который загружается объект.

  • --key — имя (путь) объекта в бакете.

  • --body — путь к файлу, который загружается.

  • --object-lock-mode — режим блокировки.

  • --object-lock-retain-until-date — дата и время окончания блокировки в формате YYYY-MM-DDTHH:MM:SSZ. До этой даты объект защищён от удаления.

Убедимся, что защита применена:

aws s3api get-object-retention \
  --bucket object-lock-bucket \
  --key governance-file.txt \
  --endpoint-url https://s3.timeweb.cloud

В ответ получим подобный вывод:

{
	"Retention": {
    	"Mode": "GOVERNANCE",
    	"RetainUntilDate": "2025-04-04T10:07:44.000000000Z"
	}
}

Попробуем удалить объект:

aws s3api delete-object \
  --bucket object-lock-bucket \
  --key governance-file.txt \
  --endpoint-url https://s3.timeweb.cloud

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

Проверим версии объекта:

aws s3api list-object-versions \
  --bucket object-lock-bucket \
  --prefix governance-file.txt \
  --endpoint-url https://s3.timeweb.cloud

Мы увидим версию объекта и маркер удаления.

Selection 190

Удаленную версию можно восстановить по инструкции.

Полное удаление возможно только с указанием обхода блокировки при помощи параметра --bypass-governance-retention.

Удаляем объект с обходом блокировки:

aws s3api delete-object \
  --bucket object-lock-bucket \
  --key governance-file.txt \
  --bypass-governance-retention \
  --version-id <VersionId_объекта> \
  --endpoint-url https://s3.timeweb.cloud

Теперь повторно проверим версии объекта:

aws s3api list-object-versions \
  --bucket object-lock-bucket \
  --prefix governance-file.txt \
  --endpoint-url https://s3.timeweb.cloud

Теперь отобразится только маркер удаления.

 

Была ли статья полезна?
Ваша оценка очень важна
Пока нет комментариев