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

# Удаление объекта

{% note warning %}

По умолчанию операция удаления необратима. [Восстановить](restore-object-version.md) можно только те объекты, которые были загружены при включенном [версионировании](../../concepts/versioning.md).

{% endnote %}

## Удалить объект или версию объекта без блокировки {#wo-object-lock}

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

{% note info %}

Объект, [составная загрузка](../../concepts/multipart.md) которого не завершена, удаляется по другой [инструкции](deleting-multipart.md).

{% endnote %}

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

Чтобы удалить объект:

{% 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/folder-tree.svg) **Объекты**.
  1. Чтобы видеть все версии объектов в списке, справа от поля поиска объекта в бакете, включите опцию **Показать версии**.
  1. Чтобы удалить один объект, нажмите ![image](../../../_assets/console-icons/ellipsis.svg) → **Удалить**.

     Чтобы выполнить это же действие с несколькими объектами, отметьте их в списке и нажмите кнопку **Удалить** в нижней части экрана.

     {% note info %}

     Можно удалить папку с объектами. Это асинхронная операция, после запуска которой объекты не исчезают сразу из бакета, а удаляются постепенно. Вы в это время можете выполнять другие операции в консоли управления, в том числе загрузку новых объектов в удаляемую папку. Детали смотрите в разделе [Папка](../../concepts/object.md#folder).

     {% endnote %}

  1. В открывшемся окне нажмите кнопку **Удалить**.

  В консоли управления информация о количестве объектов в бакете и занятом месте обновляется с задержкой в несколько минут.

  {% note info %}
  
  Работать одновременно с несколькими объектами удобнее с помощью файловых браузеров [CyberDuck](../../tools/cyberduck.md) и [WinSCP](../../tools/winscp.md) или с помощью [AWS CLI](../../tools/aws-cli.md).
  
  {% endnote %}

- Yandex Cloud CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  1. Посмотрите описание команды CLI для удаления объекта из бакета:

      ```bash
      yc storage s3api delete-object --help
      ```

  1. Получите список бакетов в каталоге по умолчанию:
     
     ```bash
     yc storage bucket list
     ```
     
     Результат:
     
     ```text
     +------------------+----------------------+-------------+-----------------------+---------------------+
     |       NAME       |      FOLDER ID       |  MAX SIZE   | DEFAULT STORAGE CLASS |     CREATED AT      |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     | first-bucket     | b1gmit33ngp6******** | 53687091200 | STANDARD              | 2022-12-16 13:58:18 |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     ```
  1. Выполните команду:

      ```bash
      yc storage s3api put-object \
        --bucket <имя_бакета> \
        --key <ключ_объекта>
      ```

      Где:

      * `--bucket` — имя вашего бакета.
      * `--key` — [ключ](../../concepts/object.md#key) объекта.

      Результат:

      ```bash
      request_id: 0311ec7********
      ```

      Альтернативная команда:

      ```bash
      yc storage s3 rm \
        s3://<имя_бакета>/<ключ_объекта>
      ```

      Результат:

      ```text
      delete: s3://my-bucket/object.txt
      ```

- AWS CLI {#aws-cli}

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

  В терминале выполните команду `aws s3api delete-object`:

  ```bash
  aws s3api delete-object \
    --endpoint-url https://storage.yandexcloud.kz \
    --bucket <имя_бакета> \
    --key <ключ_объекта>
  ```

  Где:
  * `--bucket` — имя вашего бакета.
  * `--key` — [ключ](../../concepts/object.md#key) объекта.

  Чтобы одновременно удалить список объектов, укажите ключи этих объектов в параметре `--delete`:

  * **Bash**:

      ```bash
      aws s3api delete-objects \
        --endpoint-url=https://storage.yandexcloud.kz \
        --bucket <имя_бакета> \
        --delete '{"Objects":[{"Key":"<ключ_объекта_1>"},{"Key":"<ключ_объекта_2>"},...,{"Key":"<ключ_объекта_n>"}]}'
      ```

  * **PowerShell**:

      ```powershell
      aws s3api delete-objects `
        --endpoint-url=https://storage.yandexcloud.kz `
        --bucket <имя_бакета> `
        --delete '{\"Objects\":[{\"Key\":\"<ключ_объекта_1>\"},{\"Key\":\"<ключ_объекта_2>\"},...,{\"Key\":\"<ключ_объекта_n>\"}]}'
      ```

  Где:
  * `--bucket` — имя бакета.
  * `<ключ_объекта_1>`, `<ключ_объекта_2>`, `<ключ_объекта_n>` — [ключи](../../concepts/object.md#key) объектов, которые нужно удалить.

  Результат:

  ```text
  {
    "Deleted": [
        {
            "Key": "<ключ_объекта_1>",
            "VersionId": "null"
        },
        {
            "Key": "<ключ_объекта_2>",
            "VersionId": "null"
        }
        ...
        {
            "Key": "<ключ_объекта_n>",
            "VersionId": "null"
        }
    ]
  }
  ```

  Указать объекты для удаления можно с помощью шаблона запроса в формате JMESPath. Для удаления объектов по шаблону выполните команду:

  * **Bash**:

      ```bash
      aws s3api list-objects \
        --endpoint-url https://storage.yandexcloud.kz \
        --bucket <имя_бакета> \
        --query '<запрос>' \
        --output text | xargs -I {} aws s3api delete-object --endpoint-url https://storage.yandexcloud.kz --bucket <имя_бакета> --key {}
      ```

      Где:
      * `--bucket` — имя бакета.
      * `--query` — запрос в формате [JMESPath](https://jmespath.org/).

      Пример команды для удаления из бакета `sample-bucket` всех объектов, расположенных в папке `screenshots`, имена файлов которых начинаются с даты `20231002`:

      ```bash
      aws s3api list-objects \
        --endpoint-url https://storage.yandexcloud.kz \
        --bucket sample-bucket \
        --query 'Contents[?starts_with(Key, `screenshots/20231002`) == `true`].[Key]' \
        --output text | xargs -I {} aws s3api delete-object --endpoint-url https://storage.yandexcloud.kz --bucket sample-bucket --key {}
      ```

  * **PowerShell**:

      ```powershell
      Foreach($x in (aws s3api list-objects `
        --endpoint-url https://storage.yandexcloud.kz `
        --bucket <имя_бакета> `
        --query '<запрос>' `
        --output text)) `
        {aws s3api delete-object --endpoint-url https://storage.yandexcloud.kz --bucket <имя_бакета> --key $x}
      ```

      Где:
      * `--bucket` — имя бакета.
      * `--query` — запрос в формате [JMESPath](https://jmespath.org/).

      Пример команды для удаления из бакета `sample-bucket` всех объектов, расположенных в папке `screenshots`, имена файлов которых начинаются с даты `20231002`:

      ```powershell
      Foreach($x in (aws s3api list-objects `
        --endpoint-url https://storage.yandexcloud.kz `
        --bucket sample-bucket `
        --query 'Contents[?starts_with(Key, `screenshots/20231002`) == `true`].[Key]' `
        --output text)) `
        {aws s3api delete-object --endpoint-url https://storage.yandexcloud.kz --bucket sample-bucket --key $x}
      ```

- Terraform {#tf}

  {% note info %}
  
  Если вы работаете с Object Storage через Terraform от имени [сервисного аккаунта](../../../iam/concepts/users/service-accounts.md), [назначьте](../../../iam/operations/sa/assign-role-for-sa.md) сервисному аккаунту нужную [роль](../../security/index.md#roles-list), например `storage.admin`, на каталог, в котором будут создаваться ресурсы.
  
  {% endnote %}

  [Terraform](https://www.terraform.io/) позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.
  
  Terraform распространяется под лицензией [Business Source License](https://github.com/hashicorp/terraform/blob/main/LICENSE), а [провайдер Yandex Cloud для Terraform](https://github.com/yandex-cloud/terraform-provider-yandex) — под лицензией [MPL-2.0](https://www.mozilla.org/en-US/MPL/2.0/).
  
  Подробная информация о ресурсах провайдера в документации на сайте [Terraform](https://www.terraform.io/docs/providers/yandex/index.html) или в [зеркале](../../../terraform/index.md).

  
  Если у вас еще нет 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 %}


  Чтобы удалить объект из бакета, созданный с помощью Terraform:
  1. Откройте файл конфигурации Terraform и удалите фрагмент с описанием объекта.

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

     ```hcl
     ...
     resource "yandex_storage_object" "cute-cat-picture" {
       access_key = "YCAJEX9Aw2ge********-w-lJ"
       secret_key = "YCONxG7rSdzVF9UMxLA_NRy5VbKzKlqZ********"
       bucket     = "cat-pictures"
       key        = "cute-cat"
       source     = "/images/cats/cute-cat.jpg"
     }
     ...
     ```

     {% 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**.

     Проверить изменения можно в [консоли управления](https://kz.console.yandex.cloud).

- API {#api}

  Воспользуйтесь методом S3 API [delete](../../s3/api-ref/object/delete.md).

  {% note info %}
  
  Работать одновременно с несколькими объектами удобнее с помощью файловых браузеров [CyberDuck](../../tools/cyberduck.md) и [WinSCP](../../tools/winscp.md) или с помощью [AWS CLI](../../tools/aws-cli.md).
  
  {% endnote %}

{% endlist %}

## Удалить версию объекта с блокировкой (object lock) {#w-object-lock}

Если в бакете включены [блокировки версий объектов](../buckets/configure-object-lock.md), некоторым или всем пользователям может быть запрещено удалять версию объекта.

Чтобы проверить, установлена ли блокировка, и удалить версию объекта при возможности:

{% list tabs group=instructions %}

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

  1. Если это возможно, [снимите блокировку](edit-object-lock.md) с объекта который вы хотите удалить.
  1. [Удалите](#object-lock-w-object-lock) объект.
  
  В консоли управления информация о количестве объектов в бакете и занятом месте обновляется с задержкой в несколько минут.
  
  {% note info %}
  
  Работать одновременно с несколькими объектами удобнее с помощью файловых браузеров [CyberDuck](../../tools/cyberduck.md) и [WinSCP](../../tools/winscp.md) или с помощью [AWS CLI](../../tools/aws-cli.md).
  
  {% endnote %}

- Yandex Cloud CLI {#cli}

  Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../../cli/quickstart.md#install).

  По умолчанию используется каталог, указанный при [создании](../../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

  1. Получите информации о блокировке версии объекта::

      ```bash
      yc storage s3api head-object \
        --bucket <имя_бакета> \
        --key <ключ_объекта> \
        --version-id <идентификатор_версии>
      ```

     Где:
     * `--bucket` — имя вашего бакета.
     * `--key` — [ключ](../../concepts/object.md#key) объекта.
     * `--version-id` — идентификатор версии объекта.

     Если на версию установлена блокировка, об этом отобразится информация:

     ```text     
     object_lock_mode: GOVERNANCE
     object_lock_retain_until_date: "2024-10-11T10:23:12Z"
     ```

     Или:

     ```text
     object_lock_legal_hold_status: ON
     ```

     Где:
     * `object_lock_mode` — [тип](../../concepts/object-lock.md#types) временной блокировки:
       * `GOVERNANCE` — временная управляемая блокировка. Удалить версию объекта может пользователь с ролью `storage.admin`.
       * `COMPLIANCE` — временная строгая блокировка. Удалить версию объекта нельзя.

     * `object_lock_retain_until_date` — дата и время окончания временной блокировки в любом из форматов, описанных в [стандарте HTTP](https://www.rfc-editor.org/rfc/rfc9110#name-date-time-formats). Например, `Mon, 12 Dec 2022 09:00:00 GMT`.

     * `object_lock_legal_hold_status` — статус [бессрочной блокировки](../../concepts/object-lock.md#types):
       * `ON` — включена. Удалить версию объекта нельзя. [Снять блокировку](edit-object-lock.md#remove-legal-hold) может пользователь с ролью `storage.uploader`.
       * `OFF` — выключена.

     Если на версии объекта нет блокировки, эти поля не отобразятся, и версию объекта можно удалить по [инструкции по удалению версии без блокировки](#wo-object-lock).

  1. Получите список бакетов в каталоге по умолчанию:
     
     ```bash
     yc storage bucket list
     ```
     
     Результат:
     
     ```text
     +------------------+----------------------+-------------+-----------------------+---------------------+
     |       NAME       |      FOLDER ID       |  MAX SIZE   | DEFAULT STORAGE CLASS |     CREATED AT      |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     | first-bucket     | b1gmit33ngp6******** | 53687091200 | STANDARD              | 2022-12-16 13:58:18 |
     +------------------+----------------------+-------------+-----------------------+---------------------+
     ```
  1. Если установлена временная управляемая блокировка (`"object_lock_mode": "GOVERNANCE"`) и у вас есть роль `storage.admin`, удалите версию объекта:

      ```bash
      yc storage s3api delete-object \
        --bucket <имя_бакета> \
        --key <ключ_объекта> \
        --version-id <идентификатор_версии> \
        --bypass-governance-retention
      ```

      Где:

      * `--bucket` — имя вашего бакета.
      * `--key` — [ключ](../../concepts/object.md#key) объекта.
      * `--version-id` — идентификатор версии объекта.
      * `--bypass-governance-retention` — флаг, подтверждающий обход блокировки.

      Результат:

      ```bash
      request_id: a58bf215********
      version_id: "null"
      ```

- AWS CLI {#aws-cli}

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

  1. Получите информацию о блокировке версии объекта:

     ```bash
     aws --endpoint-url=https://storage.yandexcloud.kz \
       s3api head-object \
       --bucket <имя_бакета> \
       --key <ключ_объекта> \
       --version-id <идентификатор_версии>
     ```

     Где:
     * `--bucket` — имя вашего бакета.
     * `--key` — [ключ](../../concepts/object.md#key) объекта.
     * `--version-id` — идентификатор версии объекта.

     Если на версию установлена блокировка, информация о ней отобразится в результате выполнения команды:

     ```json
     {
       ...
       "ObjectLockMode": "<тип_временной_блокировки>",
       "ObjectLockRetainUntilDate": "<дата_и_время>",
       "ObjectLockLegalHoldStatus": "<статус_бессрочной_блокировки>",
       ...
     }
     ```

     Где:
     * `ObjectLockMode` — [тип](../../concepts/object-lock.md#types) временной блокировки:
       * `GOVERNANCE` — временная управляемая блокировка. Удалить версию объекта может пользователь с ролью `storage.admin`.
       * `COMPLIANCE` — временная строгая блокировка. Удалить версию объекта нельзя.

     * `ObjectLockRetainUntilDate` — дата и время окончания временной блокировки в любом из форматов, описанных в [стандарте HTTP](https://www.rfc-editor.org/rfc/rfc9110#name-date-time-formats). Например, `Mon, 12 Dec 2022 09:00:00 GMT`.

     * `ObjectLockLegalHoldStatus` — статус [бессрочной блокировки](../../concepts/object-lock.md#types):
       * `ON` — включена. Удалить версию объекта нельзя. [Снять блокировку](edit-object-lock.md#remove-legal-hold) может пользователь с ролью `storage.uploader`.
       * `OFF` — выключена.

     Если на версии объекта нет блокировки, эти поля не отобразятся, и версию объекта можно удалить по [инструкции по удалению версии без блокировки](#wo-object-lock).

  1. Если установлена временная управляемая блокировка (`"ObjectLockMode": "GOVERNANCE"`) и у вас есть роль `storage.admin`, удалите версию объекта:

     ```bash
     aws --endpoint-url=https://storage.yandexcloud.kz \
       s3api delete-object \
       --bucket <имя_бакета> \
       --key <ключ_объекта> \
       --version-id <идентификатор_версии> \
       --bypass-governance-retention
     ```

     Где:
     * `--bucket` — имя вашего бакета.
     * `--key` — [ключ](../../concepts/object.md#key) объекта.
     * `--version-id` — идентификатор версии объекта.
     * `--bypass-governance-retention` — флаг, подтверждающий обход блокировки.

- API {#api}

  1. Чтобы получить информацию о блокировке версии объекта, воспользуйтесь методами S3 API [getObjectRetention](../../s3/api-ref/object/getobjectretention.md) (временная блокировка) и [getObjectLegalHold](../../s3/api-ref/object/getobjectlegalhold.md) (бессрочная блокировка).
  1. Если установлена только временная управляемая блокировка (`GOVERNANCE`) и у вас есть роль `storage.admin`, для удаления версии объекта воспользуйтесь методом S3 API [delete](../../s3/api-ref/object/delete.md). Укажите в запросе идентификатор версии и заголовок `X-Amz-Bypass-Governance-Retention`, чтобы подтвердить обход блокировки.

{% endlist %}