---
title: 'AWS CLI в S3'
sidebar_label: 'AWS CLI'
sidebar_position: 3
description: 'Как настроить AWS CLI и работать с хранилищем через интерфейс командной строки AWS CLI'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import {TabItemLabel} from '@selectel/docux/components'
import GrantAccess from '@site/docs/_partials/s3/grant-access.mdx'

# AWS CLI в S3

[AWS CLI](https://aws.amazon.com/ru/cli/) (AWS Command Line Interface) — это интерфейс командной строки для работы с сервисами AWS.

## Настроить AWS CLI \{#configure-aws-cli}

1. [Настройте доступ к S3](#configure-s3-access).
2. [Установите клиент](#install-client).
3. [Создайте конфигурацию AWS CLI](#create-configuration).
4. [Установите сертификат](#configure-certificate).

### 1. Настроить доступ к S3 \{#configure-s3-access}

<GrantAccess />

### 2. Установить клиент \{#install-client}

Используйте инструкцию [Install or update to the latest version of the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) документации Amazon.

### 3. Создать конфигурацию AWS CLI \{#create-configuration}

1. Откройте терминал.

2. Откройте режим конфигурирования:

   ```bash
   aws configure
   ```

3. Введите `AWS Access Key ID` — значение поля **Access key** из [S3-ключа](#configure-s3-access).

4. Введите `AWS Secret Access Key` — значение поля **Secret key** из S3-ключа.

5. Введите `Default region name` — [пул](/infrastructure/locations.mdx#pool), в котором находится S3 (например, `ru-1`).

6. Введите `Default output format` или оставьте пустым.

7. Настройки будут сохранены в конфигурационных файлах:

   * учетные данные в `.aws/credentials`:

     ```bash
     [default]
     aws_access_key_id = <access_key>
     aws_secret_access_key = <secret_key>
     ```

   * пул по умолчанию в `.aws/config`:

     ```bash
     [default]
        region = <pool>
     ```

8. В конфигурационном файле `.aws/config` добавьте параметр `endpoint_url`:

   ```bash
   [default]
       region = <pool>
       endpoint_url = https://<s3_domain>
   ```

   Укажите `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains) для нужного пула.

### 4. Установить сертификат \{#configure-certificate}

<Tabs queryString="os">
  <TabItem value="ubuntudebian" default>
    <TabItemLabel>
      Linux/macOS
    </TabItemLabel>

    1. Создайте папку `~/.selectels3/`:

       ```
       mkdir -p ~/.selectels3/
       ```

    2. Скачайте сертификат и поместите его в папку `~/.selectels3/`:

       ```
       wget https://secure.globalsign.net/cacert/root-r6.crt -O ~/.selectels3/root.crt
       openssl x509 -inform der -in ~/.selectels3/root.crt -out ~/.selectels3/root.crt
       chmod 600 ~/.selectels3/root.crt
       ```

    3. В конфигурационный файл `.aws/config` добавьте параметр:

       ```
       ca_bundle = ~/.selectels3/root.crt
       ```
  </TabItem>

  <TabItem value="windows">
    <TabItemLabel>
      Windows
    </TabItemLabel>

    1. [Скачайте сертификат](https://secure.globalsign.net/cacert/root-r6.crt).
    2. Создайте текстовый файл — например, `root.txt`.
    3. В файл `root.txt` добавьте содержимое сертификата в формате base64.
    4. В конфигурационный файл `.aws/config` добавьте параметр:

       ```
       ca_bundle = <path>
       ```

       Укажите `<path>` — путь до файла `root.txt`.
  </TabItem>
</Tabs>

## Работа с AWS CLI \{#working-with-aws-cli}

Синтаксис команд смотрите в инструкции [AWS](https://docs.aws.amazon.com/cli/latest/reference/) документации Amazon.

Для работы с S3 через AWS CLI используйте:

* [s3api](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) — команды, соответствующие операциям в REST API;
* [s3](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) — дополнительные команды, упрощающие работу с большим количеством объектов.

### Вывести список бакетов \{#list-buckets}

1. Откройте CLI.
2. Выведите список бакетов:

   ```bash
   aws s3 ls
   ```

### Создать бакет \{#create-bucket}

1. Откройте CLI.
2. Создайте бакет:

   ```bash
   aws s3 mb s3://<bucket_name>
   ```

   Укажите `<bucket_name>` — имя нового бакета.

### Посмотреть список объектов \{#view-object-list}

1. Откройте CLI.
2. Посмотрите список объектов:

   ```bash
   aws s3 ls --recursive s3://<bucket_name>
   ```

   Укажите `<bucket_name>` — имя бакета, в котором нужно посмотреть список объектов.

### Загрузить объект \{#upload-object}

<Tabs queryString="upload-object">
  <TabItem value="without-condition" default>
    <TabItemLabel>
      Простая загрузка
    </TabItemLabel>

    1. Откройте CLI.
    2. Загрузите объект в бакет:

       ```bash
       aws s3 cp <path_to_object> s3://<bucket_name>/
       ```

       Укажите:

       * `<path_to_object>` — путь в бакете, по которому будет храниться объект;
       * `<bucket_name>` — имя бакета, в котором будет храниться объект.
  </TabItem>

  <TabItem value="with-condition">
    <TabItemLabel>
      Загрузка с условием
    </TabItemLabel>

    Вы можете использовать [условные запросы](/s3/objects/conditional-requests.mdx) при загрузке объектов через AWS CLI.

    <Tabs queryString="upload-object-with-condition">
      <TabItem value="if-match" default>
        <TabItemLabel>
          Условие наличия объекта
        </TabItemLabel>

        Объект будет загружен, если в бакете существует объект c ETag, который совпадает со значением из заголовка `If-Match`.
        Если объект с таким ETag не найден, вернется ошибка `412 Precondition Failed`.

        1. Откройте CLI.

        2. Посмотрите ETag объекта, который должен существовать в бакете, чтобы новый объект был загружен:

           ```bash
           aws s3api head-object \
           --bucket <bucket_name_1> \
           --key <path_to_object_1>
           ```

           Укажите:

           * `<bucket_name_1>` — имя бакета, в котором хранится объект;
           * `<path_to_object_1>` — путь к объекту в бакете.

        3. Загрузите объект с условием:

           ```bash
           aws s3api put-object \
           --bucket <bucket_name_2> \ 
           --key <path_to_object_2> \
           --body <path_to_file> \
           --if-match "<etag>"
           ```

           Укажите:

           * `<bucket_name_2>` — имя бакета, в который будет загружен объект;
           * `<path_to_object_2>` — путь в бакете, по которому будет храниться объект;
           * `<path_to_file>` — путь к файлу на локальном устройстве;
           * `<etag>` — ETag объекта, который вы посмотрели на шаге 2.
      </TabItem>

      <TabItem value="if-none-match">
        <TabItemLabel>
          Условие отсутствия объекта
        </TabItemLabel>

        Объект будет загружен, если в бакете не существует объекта c ключом, который совпадает со значением из заголовка `If-None-Match`.
        Это позволяет избежать перезаписи объекта.
        Если объект с таким ключом уже есть в бакете, вернется ошибка `412 Precondition Failed`.

        1. Откройте CLI.
        2. Загрузите объект с условием:

           ```bash
           aws s3api put-object \
           --bucket <bucket_name> \
           --key <path_to_object> \
           --body <path_to_file> \
           --if-none-match "*"
           ```

           Укажите:

           * `<bucket_name>` — имя бакета, в котором будет храниться объект;
           * `<path_to_object>` — путь в бакете, по которому будет храниться объект;
           * `<path_to_file>` — путь к файлу на локальном устройстве.

           Здесь `--if-none-match "*"` означает, что объект будет загружен, только если по указанному пути в бакете еще нет объекта.
      </TabItem>
    </Tabs>
  </TabItem>

  <TabItem value="with-object-lock">
    <TabItemLabel>
      Загрузка с Object Lock
    </TabItemLabel>

    Если в бакете [включен Object Lock](/s3/buckets/object-lock.mdx#enable-object-lock), вы можете загрузить объект сразу с временной блокировкой.

    1. Откройте CLI.
    2. Загрузите объект с временной блокировкой:

       ```bash
       aws s3api put-object \
         --bucket <bucket_name> \
         --key <path_to_object> \
         --body <path_to_file> \
         --object-lock-mode <lock_mode> \
         --object-lock-retain-until-date <date>
       ```

       Укажите:

       * `<bucket_name>` — имя бакета;
       * `<path_to_object>` — путь в бакете, по которому будет храниться объект;
       * `<path_to_file>` — путь к файлу на локальном устройстве;
       * `<lock_mode>` — [режим блокировки](/s3/buckets/object-lock.mdx#lock-types-and-modes). Возможные значения — `GOVERNANCE` или `COMPLIANCE`;
       * `<date>` — дата, до которой объект будет заблокирован, в формате ISO 8601, например `2025-09-06T00:00:00Z`. Срок блокировки объекта не может быть больше 100 лет или 36 500 дней.
  </TabItem>
</Tabs>

### Получить ссылку на объект \{#obtain-link-to-object}

Вы можете получить ссылку на объект в публичном или приватном бакете через подписанный URL (Presigned URL).
Подробнее о Presigned URLs в инструкции [Sharing objects with presigned URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html) документации AWS.

1. Откройте CLI.
2. Получите ссылку:

   ```bash
   aws s3 presign s3://<bucket_name>/<path_to_object> --expires-in <time>
   ```

   Укажите:

   * `<bucket_name>` — имя бакета, в котором хранится объект;
   * `<path_to_object>` — путь к объекту в бакете;
   * опционально: `--expires-in <time>` — срок действия ссылки, где `<time>` — время в секундах, через которое ссылка перестанет работать. Если не добавить параметр `--expires-in <time>`, ссылка будет работать один час.

### Копировать объект \{#copy-object}

<Tabs queryString="copy-object">
  <TabItem value="without-condition" default>
    <TabItemLabel>
      Простое копирование
    </TabItemLabel>

    1. Откройте CLI.
    2. Скопируйте объект:

       ```bash
       aws s3 cp s3://<bucket_name_1>/<path_to_object_1> s3://<bucket_name_2>/<path_to_object_2>
       ```

       Укажите:

       * `<bucket_name_1>` — имя бакета, в котором хранится объект для копирования;
       * `<path_to_object_1>` — путь к объекту для копирования в бакете;
       * `<bucket_name_2>` — имя бакета, в который будет скопирован объект;
       * `<path_to_object_2>` — путь в бакете, по которому будет храниться объект.
  </TabItem>

  <TabItem value="with-condition">
    <TabItemLabel>
      Копирование с условием
    </TabItemLabel>

    Вы можете использовать [условные запросы](/s3/objects/conditional-requests.mdx) при копировании объектов через AWS CLI.

    <Tabs>
      <TabItem value="copy-source-if-match">
        <TabItemLabel>
          Условие неизменности объекта
        </TabItemLabel>

        Объект будет скопирован, если его ETag совпадает со значением, которое вы укажете в заголовке `--copy-source-if-match` — то есть, если объект не был изменен.
        Если ETag объекта не совпадает, вернется ошибка `412 Precondition Failed`.

        1. Откройте CLI.
        2. Скопируйте объект с условием:

           ```bash
           aws s3api copy-object \
           --copy-source <bucket_name_1>/<path_to_object_1> \
           --bucket <bucket_name_2> \
           --key <path_to_object_2> \
           --copy-source-if-match "<etag>" 
           ```

           Укажите:

           * `<bucket_name_1>` — имя бакета, в котором хранится объект для копирования;
           * `<path_to_object_1>` — путь к объекту для копирования в бакете;
           * `<bucket_name_2>` — имя бакета, в который будет скопирован объект;
           * `<path_to_object_2>` — путь в бакете, по которому будет храниться скопированный объект;
           * `<etag>` — ETag, который должен совпадать с ETag объекта.
      </TabItem>

      <TabItem value="copy-source-if-none-match">
        <TabItemLabel>
          Условие изменения объекта
        </TabItemLabel>

        Объект будет скопирован, если его ETag не совпадает со значением, которое вы укажете в заголовке `--copy-source-if-none-match` — то есть, если объект был изменен.
        Если ETag объекта совпадает, вернется ошибка `412 Precondition Failed`.

        1. Откройте CLI.
        2. Скопируйте объект с условием:

           ```bash
           aws s3api copy-object \
           --copy-source <bucket_name_1>/<path_to_object_1> \
           --bucket <bucket_name_2> \
           --key <path_to_object_2> \
           --copy-source-if-none-match "<etag>" 
           ```

           Укажите:

           * `<bucket_name_1>` — имя бакета, в котором хранится объект для копирования;
           * `<path_to_object_1>` — путь к объекту для копирования в бакете;
           * `<bucket_name_2>` — имя бакета, в который будет скопирован объект;
           * `<path_to_object_2>` — путь в бакете, по которому будет храниться скопированный объект;
           * `<etag>` — ETag, который не должен совпадать с ETag объекта.
      </TabItem>
    </Tabs>
  </TabItem>
</Tabs>

### Удалить объект \{#delete-object}

<Tabs queryString="delete-object">
  <TabItem value="without-condition" default>
    <TabItemLabel>
      Простое удаление
    </TabItemLabel>

    1. Откройте CLI.
    2. Удалите объект:

       ```bash
       aws s3 rm s3://<bucket_name>/<object_name>
       ```

       Укажите:

       * `<bucket_name>` — имя бакета;
       * `<object_name>` — имя объекта.
  </TabItem>

  <TabItem value="with-condition">
    <TabItemLabel>
      Удаление с условием
    </TabItemLabel>

    Вы можете использовать [условные запросы](/s3/objects/conditional-requests.mdx) при удалении объектов через AWS CLI — это поможет снизить риск случайного удаления файла.

    Объект будет удален, если в бакете существует объект c ETag, который совпадает со значением из заголовка `If-Match`.
    Если объект с таким ETag не найден, вернется ошибка `412 Precondition Failed`.

    1. Откройте CLI.

    2. Посмотрите ETag объекта, который должен существовать в бакете, чтобы нужный объект был удален:

       ```bash
       aws s3api head-object \
       --bucket <bucket_name_1> \
       --key <path_to_object_1>
       ```

       Укажите:

       * `<bucket_name_1>` — имя бакета, в котором хранится объект;
       * `<path_to_object_1>` — путь к объекту в бакете.

    3. Удалите объект с условием:

       ```bash
       aws s3api delete-object \
       --bucket <bucket_name_2> \
       --key <path_to_object_2> \
       --if-match "<etag>"
       ```

       Укажите:

       * `<bucket_name_2>` — имя бакета, в котором хранится объект;
       * `<path_to_object_2>` — путь к объекту в бакете;
       * `<etag>` — ETag объекта, который вы посмотрели на шаге 2.
  </TabItem>
</Tabs>

<Formbricks />
