[Документация Yandex Cloud](../../../index.md) > [Yandex Object Storage](../../index.md) > [Пошаговые инструкции](../index.md) > Бакеты > Управление блокировками версий объектов

# Управление блокировками версий объектов (object lock) в бакете

В [версионируемых](versioning.md) бакетах можно настроить механизм _[блокировки версий объектов](../../concepts/object-lock.md)_ (object lock). Когда он включен, вы можете установить на версию объекта блокировку, то есть запрет на удаление или перезапись. Также для бакета можно настроить блокировки по умолчанию: они будут устанавливаться на все новые версии объектов.

{% note info %}

Блокировка версий объектов невозможна в бакетах с выключенным или приостановленным версионированием.

При включенной блокировке версионирование нельзя приостановить.

{% endnote %}

## Включить возможность блокировок {#enable}

Включение механизма блокировок не устанавливает блокировки на уже загруженные версии объектов, а только позволяет устанавливать их.

Минимальная необходимая роль — `storage.admin`.

Чтобы включить возможность блокировок:

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог.
  1. [Перейдите](https://kz.console.yandex.cloud/link/storage) в сервис **Object Storage**.
  1. Выберите бакет, для которого хотите настроить блокировку.
  1. На панели слева выберите ![image](../../../_assets/console-icons/persons-lock.svg) **Безопасность**.
  1. Выберите вкладку **Блокировки объектов**.
  1. Чтобы включить возможность работать с блокировками, включите опцию **Включить блокировки**.
  1. Нажмите **Сохранить**.

- AWS CLI {#cli}

  Если у вас еще нет AWS CLI, [установите и сконфигурируйте его](../../tools/aws-cli.md).

  Выполните следующую команду:

  ```bash
  aws s3api put-object-lock-configuration \
    --bucket <имя_бакета> \
    --object-lock-configuration ObjectLockEnabled=Enabled \
    --endpoint-url=https://storage.yandexcloud.kz
  ```

  Где:

  * `--bucket` — имя бакета.
  * `--object-lock-configuration` — настройки блокировок в бакете. Значение `ObjectLockEnabled=Enabled` включает механизм блокировок.
  * `--endpoint-url` — эндпоинт Object Storage.

- Terraform {#tf}

  Если у вас еще нет Terraform, [установите его и настройте провайдер Yandex Cloud](../../../tutorials/infrastructure-management/terraform-quickstart.md#install-terraform).
  
  
  Чтобы управлять инфраструктурой с помощью Terraform от имени сервисного аккаунта или пользовательских аккаунтов: аккаунта на Яндексе, федеративного аккаунта и локального пользователя, [аутентифицируйтесь](../../../terraform/authentication.md) соответствующим способом.

  
  {% note warning %}
  
  Для корректной работы Terraform в [регионе Казахстан](../../../overview/concepts/region.md) укажите в конфигурационном файле Terraform в блоке `provider` эндпоинты API Yandex Cloud и Object Storage: 
  
  ```hcl
  provider "yandex" {
    zone             = "kz1-a"
    endpoint         = "api.yandexcloud.kz:443"
    storage_endpoint = "https://storage.yandexcloud.kz"
  }
  ```
  
  Подробнее о настройках провайдера в разделе [Настройте провайдер](../../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider).
  
  {% endnote %}


  1. Откройте файл конфигурации Terraform и добавьте к описанию бакета блок `object_lock_configuration`:

      ```hcl
      resource "yandex_storage_bucket" "b" {
        ...
        object_lock_configuration {
          object_lock_enabled = "Enabled"
        }
      }
      ```

      Где:

      * `object_lock_configuration` — настройки блокировки версий объектов:
        * `object_lock_enabled` — включает блокировку версий объектов. Требует включенное версионирование бакета. Необязательный параметр.

      Более подробная информация о параметрах бакета, которые вы можете задать с помощью Terraform, приведена в [документации провайдера](../../../terraform/resources/storage_bucket.md).

  1. Создайте ресурсы:

      1. В терминале перейдите в директорию с конфигурационным файлом.
      1. Проверьте корректность конфигурации с помощью команды:
      
         ```bash
         terraform validate
         ```
      
         Если конфигурация является корректной, появится сообщение:
      
         ```bash
         Success! The configuration is valid.
         ```
      
      1. Выполните команду:
      
         ```bash
         terraform plan
         ```
      
         В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
      1. Примените изменения конфигурации:
      
         ```bash
         terraform apply
         ```
      
      1. Подтвердите изменения: введите в терминале слово `yes` и нажмите **Enter**.

  После этого в указанном каталоге будет создана блокировка объектов для бакета. Проверить появление блокировки можно с помощью команды [CLI](../../../cli/quickstart.md):

    ```bash
    yc storage bucket get <имя_бакета>
    ```

    Результат:

    ```text
    name: my-bucket
    folder_id: b1geoelk2fld*********
    ...
    object_lock:
      status: OBJECT_LOCK_STATUS_ENABLED
    ```

- API {#api}

  Воспользуйтесь методом S3 API [putObjectLockConfiguration](../../s3/api-ref/bucket/putobjectlockconfiguration.md), методом REST API [update](../../api-ref/Bucket/update.md) для ресурса [Bucket](../../api-ref/Bucket/index.md) или вызовом gRPC API [BucketService/Update](../../api-ref/grpc/Bucket/update.md).

{% endlist %}

## Настроить блокировки по умолчанию {#default}

Блокировки по умолчанию устанавливаются на все новые версии объектов, загружаемые в бакет. Настройки не влияют на уже загруженные версии.

Минимальная необходимая роль — `storage.admin`.

Чтобы настроить блокировки по умолчанию:

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог.
  1. [Перейдите](https://kz.console.yandex.cloud/link/storage) в сервис **Object Storage**.
  1. Выберите бакет, для которого хотите настроить блокировку по умолчанию.
  1. На панели слева выберите ![image](../../../_assets/console-icons/persons-lock.svg) **Безопасность**.
  1. Выберите вкладку **Блокировки объектов**.
  1. Чтобы включить или выключить возможность работать с блокировками, используйте опцию **Включить блокировки**.
  1. Включите опцию **Блокировки по умолчанию для новых версий**.
  1. Выберите **Тип блокировки по умолчанию**:
     * **Временная управляемая (governance)** — пользователь с ролью `storage.admin` может обойти блокировку, изменить ее срок или снять ее.
     * **Временная строгая (compliance)** — пользователь с ролью `storage.admin` может только продлить блокировку. Обойти, сократить или снять блокировку до ее окончания нельзя.
  1. Установите **Срок блокировки по умолчанию** в днях или годах. Отсчитывается от момента, когда версия объекта загружена в бакет.
  1. Нажмите **Сохранить**.

- AWS CLI {#cli}

  Если у вас еще нет AWS CLI, [установите и сконфигурируйте его](../../tools/aws-cli.md).

  1. Опишите конфигурацию блокировок по умолчанию в формате JSON:
 
     ```json
     {
       "ObjectLockEnabled": "Enabled",
       "Rule": {
         "DefaultRetention": {
           "Mode": "<тип_блокировки>",
           "Days": <срок_блокировки_в_днях>,
           "Years": <срок_блокировки_в_годах>
         }
       }
     }
     ```

     Где:

     * `ObjectLockEnabled` — статус механизма блокировок: `Enabled` — механизм включен.
 
       {% note alert %}

       Это обязательное поле. Если не указать его со значением `Enabled`, появится сообщение об ошибке `InvalidRequest`, а механизм блокировок не включится. Смотрите также [Выключить возможность блокировок](#disable).

       {% endnote %}

     * `Mode` — [тип](../../concepts/object-lock.md#types) блокировки:

       * `GOVERNANCE` — временная управляемая блокировка.
       * `COMPLIANCE` — временная строгая блокировка.

     * `Days` — срок блокировки в днях от момента загрузки версии объекта. Должен быть положительным целым числом. Нельзя указывать вместе с `Years`.
     * `Years` — срок блокировки в годах от момента загрузки версии объекта. Должен быть положительным целым числом. Нельзя указывать вместе с `Days`.

     Готовую конфигурацию можно поместить в файл, например, `default-object-lock.json`.

  1. Загрузите конфигурацию в бакет:

     ```bash
     aws s3api put-object-lock-configuration \
       --bucket <имя_бакета> \
       --object-lock-configuration file://default-object-lock.json \
       --endpoint-url=https://storage.yandexcloud.kz
     ```

     Где:

     * `--bucket` — имя бакета.
     * `--object-lock-configuration` — настройки блокировок по умолчанию. В данном случае указаны в файле `default-object-lock.json`.
     * `--endpoint-url` — эндпоинт Object Storage.

- Terraform {#tf}

  Если у вас еще нет Terraform, [установите его и настройте провайдер Yandex Cloud](../../../tutorials/infrastructure-management/terraform-quickstart.md#install-terraform).
  
  
  Чтобы управлять инфраструктурой с помощью Terraform от имени сервисного аккаунта или пользовательских аккаунтов: аккаунта на Яндексе, федеративного аккаунта и локального пользователя, [аутентифицируйтесь](../../../terraform/authentication.md) соответствующим способом.

  
  {% note warning %}
  
  Для корректной работы Terraform в [регионе Казахстан](../../../overview/concepts/region.md) укажите в конфигурационном файле Terraform в блоке `provider` эндпоинты API Yandex Cloud и Object Storage: 
  
  ```hcl
  provider "yandex" {
    zone             = "kz1-a"
    endpoint         = "api.yandexcloud.kz:443"
    storage_endpoint = "https://storage.yandexcloud.kz"
  }
  ```
  
  Подробнее о настройках провайдера в разделе [Настройте провайдер](../../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider).
  
  {% endnote %}


  1. Откройте файл конфигурации Terraform и  добавьте настройки блокировок по умолчанию в блок `object_lock_configuration`:

      ```
      ...
      rule {
        default_retention {
          mode = "GOVERNANCE"
          years = 1
        }
      }
      ...
      ```

      Где:

      * `rule` — правило для блокировки версий объектов. Содержит в себе параметр `default_retention` с настройками хранения:
        * `mode` — тип блокировки. Может принимать значения `GOVERNANCE` или `COMPLIANCE`. Необязательный параметр.
        * `years` или `days` — время, на которое распространяется блокировка объекта. Указывается в виде числа. Необязательный параметр.

     Более подробная информация о параметрах ресурса `yandex_storage_bucket` в Terraform приведена в [документации провайдера](../../../terraform/resources/storage_bucket.md).

  1. Примените изменения:

      1. В терминале перейдите в директорию с конфигурационным файлом.
      1. Проверьте корректность конфигурации с помощью команды:
      
         ```bash
         terraform validate
         ```
      
         Если конфигурация является корректной, появится сообщение:
      
         ```bash
         Success! The configuration is valid.
         ```
      
      1. Выполните команду:
      
         ```bash
         terraform plan
         ```
      
         В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
      1. Примените изменения конфигурации:
      
         ```bash
         terraform apply
         ```
      
      1. Подтвердите изменения: введите в терминале слово `yes` и нажмите **Enter**.

  Проверить появление блокировки можно с помощью команды [CLI](../../../cli/quickstart.md):

    ```bash
    yc storage bucket get <имя_бакета>
    ```

    Результат:

    ```text
    name: my-bucket
    folder_id: b1geoelk2fld********
    ...
    object_lock:
    status: OBJECT_LOCK_STATUS_ENABLED
    default_retention:
      mode: MODE_GOVERNANCE
      years: "1"
    ```

{% endlist %}

## Выключить возможность блокировок {#disable}

Выключение механизма блокировок не снимает установленные блокировки: они продолжают работать, их нельзя будет снять или изменить.

Минимальная необходимая роль — `storage.admin`.

Чтобы выключить возможность блокировок:

{% list tabs group=instructions %}

- Консоль управления {#console}

  1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог.
  1. [Перейдите](https://kz.console.yandex.cloud/link/storage) в сервис **Object Storage**.
  1. Выберите бакет, для которого хотите настроить блокировку.
  1. На панели слева выберите ![image](../../../_assets/console-icons/persons-lock.svg) **Безопасность**.
  1. Выберите вкладку **Блокировки объектов**.
  1. Чтобы выключить возможность работать с блокировками, выключите опцию **Включить блокировки**.
  1. Нажмите **Сохранить**.

- AWS CLI {#cli}

  Если у вас еще нет AWS CLI, [установите и сконфигурируйте его](../../tools/aws-cli.md).

  Выполните следующую команду:

  ```bash
  aws s3api put-object-lock-configuration \
    --bucket <имя_бакета> \
    --object-lock-configuration ObjectLockEnabled="" \
    --endpoint-url=https://storage.yandexcloud.kz
  ```

  Где:

  * `--bucket` — имя бакета.
  * `--object-lock-configuration` — настройки блокировок в бакете. Значение `ObjectLockEnabled=""` отключает механизм блокировок.
  * `--endpoint-url` — эндпоинт Object Storage.

- Terraform {#tf}

  Если у вас еще нет Terraform, [установите его и настройте провайдер Yandex Cloud](../../../tutorials/infrastructure-management/terraform-quickstart.md#install-terraform).
  
  
  Чтобы управлять инфраструктурой с помощью Terraform от имени сервисного аккаунта или пользовательских аккаунтов: аккаунта на Яндексе, федеративного аккаунта и локального пользователя, [аутентифицируйтесь](../../../terraform/authentication.md) соответствующим способом.

  
  {% note warning %}
  
  Для корректной работы Terraform в [регионе Казахстан](../../../overview/concepts/region.md) укажите в конфигурационном файле Terraform в блоке `provider` эндпоинты API Yandex Cloud и Object Storage: 
  
  ```hcl
  provider "yandex" {
    zone             = "kz1-a"
    endpoint         = "api.yandexcloud.kz:443"
    storage_endpoint = "https://storage.yandexcloud.kz"
  }
  ```
  
  Подробнее о настройках провайдера в разделе [Настройте провайдер](../../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider).
  
  {% endnote %}


  1. Откройте файл конфигурации Terraform и удалите блок `object_lock_configuration`:

      {% cut "Пример описания блокировки версий объектов в конфигурации Terraform" %}

        ```
        ...
        object_lock_configuration {
          object_lock_enabled = "Enabled"
          rule {
            default_retention {
              mode = "GOVERNANCE"
              years = 1
            }
          }
        }
        ...
        ```

      {% endcut %}

  1. Примените изменения:

      1. В терминале перейдите в директорию с конфигурационным файлом.
      1. Проверьте корректность конфигурации с помощью команды:
      
         ```bash
         terraform validate
         ```
      
         Если конфигурация является корректной, появится сообщение:
      
         ```bash
         Success! The configuration is valid.
         ```
      
      1. Выполните команду:
      
         ```bash
         terraform plan
         ```
      
         В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
      1. Примените изменения конфигурации:
      
         ```bash
         terraform apply
         ```
      
      1. Подтвердите изменения: введите в терминале слово `yes` и нажмите **Enter**.

  Проверить удаление блокировки можно с помощью команды [CLI](../../../cli/quickstart.md):

    ```bash
    yc storage bucket get <имя_бакета>
    ```

    Результат:

    ```text
    name: my-bucket
    folder_id: b1geoelk2fld********
    ...
    object_lock:
      status: OBJECT_LOCK_STATUS_DISABLED
    ```

- API {#api}

  Чтобы выключить возможность блокировок версий объектов в бакете, воспользуйтесь методом S3 API [putObjectLockConfiguration](../../s3/api-ref/bucket/putobjectlockconfiguration.md), методом REST API [update](../../api-ref/Bucket/update.md) для ресурса [Bucket](../../api-ref/Bucket/index.md) или вызовом gRPC API [BucketService/Update](../../api-ref/grpc/Bucket/update.md).

  В теле запроса передайте параметр блокировки версий объектов с пустым значением:

  * `ObjectLockConfiguration` — для S3 API.
  * `objectLock` — для REST API.
  * `object_lock` — для gRPC API.

  Пример тела HTTP-запроса для S3 API:

  ```xml
  <ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/" />
  ```

{% endlist %}