AWS CLI
AWS CLI (AWS Command Line Interface) — это интерфейс командной строки для работы с сервисами AWS.
Настроить AWS CLI
1. Настроить доступ к S3
Настроить доступ может Владелец аккаунта или пользователь с ролью iam.admin.
- Создайте сервисного пользователя с ролью с доступом в S3. Если вы создали сервисного пользователя с ролью
object_storage_userилиs3.bucket.user, в бакете должна быть настроена политика доступа и ее правила должны разрешать доступ этому пользователю. - Выдайте пользователю S3-ключ.
2. Установить клиент
Используйте инструкцию Install or update to the latest version of the AWS CLI документации Amazon.
3. Создать конфигурацию AWS CLI
-
Откройте терминал.
-
Откройте режим конфигурирования:
aws configure -
Введите
AWS Access Key ID— значение поля Access key из S3-ключа. -
Введите
AWS Secret Access Key— значение поля Secret key из S3-ключа. -
Введите
Default region name— пул, в котором находится S3 (например,ru-1). -
Введите
Default output formatили оставьте пустым. -
Настройки будут сохранены в конфигурационных файлах:
-
учетные данные в
.aws/credentials:[default]
aws_access_key_id = <access_key>
aws_secret_access_key = <secret_key> -
пул по умолчанию в
.aws/config:[default]
region = <pool>
-
-
В конфигурационном файле
.aws/configдобавьте параметрendpoint_url:[default]
region = <pool>
endpoint_url = https://<s3_domain>Укажите
<s3_domain>— домен S3 API для нужного пула.
4. Установить сертификат
Linux/macOS
Windows
-
Создайте папку
~/.selectels3/:mkdir -p ~/.selectels3/ -
Скачайте сертификат и поместите его в папку
~/.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 -
В конфигурационный файл
.aws/configдобавьте параметр:ca_bundle = ~/.selectels3/root.crt
-
Создайте текстовый файл — например,
root.txt. -
В файл
root.txtдобавьте содержимое сертификата в формате base64. -
В конфигурационный файл
.aws/configдобавьте параметр:ca_bundle = <path>Укажите
<path>— путь до файлаroot.txt.
Работа с AWS CLI
Синтаксис команд смотрите в инструкции AWS документации Amazon.
Для работы с S3 через AWS CLI используйте:
- s3api — команды, соответствующие операциям в REST API;
- s3 — дополнительные команды, упрощающие работу с большим количеством объектов.
Вывести список бакетов
-
Откройте CLI.
-
Выведите список бакетов:
aws s3 ls
Создать бакет
-
Откройте CLI.
-
Создайте бакет:
aws s3 mb s3://<bucket_name>Укажите
<bucket_name>— имя нового бакета.
Посмотреть список объектов
-
Откройте CLI.
-
Посмотрите список объектов:
aws s3 ls --recursive s3://<bucket_name>Укажите
<bucket_name>— имя бакета, в котором нужно посмотреть список объектов.
Загрузить объект
Простая загрузка
Загрузка с условием
-
Откройте CLI.
-
Загрузите объект в бакет:
aws s3 cp <path_to_object> s3://<bucket_name>/Укажите:
<path_to_object>— путь в бакете, по которому будет храниться объект;<bucket_name>— имя бакета, в котором будет храниться объект.
Вы можете использовать условные запросы при загрузке объектов через AWS CLI.
Условие наличия объекта
Условие отсутствия объекта
Объект будет загружен, если в бакете существует объект c ETag, который совпадает со значением из заголовка If-Match.
Если объект с таким ETag не найден, вернется ошибка 412 Precondition Failed.
-
Откройте CLI.
-
Посмотрите ETag объекта, который должен существовать в бакете, чтобы новый объект был загружен:
aws s3api head-object \
--bucket <bucket_name_1> \
--key <path_to_object_1>Укажите:
<bucket_name_1>— имя бакета, в котором хранится объект;<path_to_object_1>— путь к объекту в бакете.
-
Загрузите объект с условием:
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.
Объект будет загружен, если в бакете не существует объекта c ключом, который совпадает со значением из заголовка If-None-Match.
Это позволяет избежать перезаписи объекта.
Если объект с таким ключом уже есть в бакете, вернется ошибка 412 Precondition Failed.
-
Откройте CLI.
-
Загрузите объект с условием:
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 "*"означает, что объект будет загружен, только если по указанному пути в бакете еще нет объекта.
Получить ссылку на объект
Вы можете получить ссылку на объект в публичном или приватном бакете через подписанный URL (Presigned URL). Подробнее о Presigned URLs в инструкции Sharing objects with presigned URLs документации AWS.
-
Откройте CLI.
-
Получите ссылку:
aws s3 presign s3://<bucket_name>/<path_to_object> --expires-in <time>Укажите:
<bucket_name>— имя бакета, в котором хранится объект;<path_to_object>— путь к объекту в бакете;- опционально:
--expires-in <time>— срок действия ссылки, где<time>— время в секундах, через которое ссылка перестанет работать. Если не добавить параметр--expires-in <time>, ссылка будет работать один час.
Копировать объект
Простое копирование
Копирование с условием
-
Откройте CLI.
-
Скопируйте объект:
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>— путь в бакете, по которому будет храниться объект.
Вы можете использовать условные запросы при копировании объектов через AWS CLI.
Условие неизменности объекта
Условие изменения объекта
Объект будет скопирован, если его ETag совпадает со значением, которое вы укажете в заголовке --copy-source-if-match — то есть, если объект не был изменен.
Если ETag объекта не совпадает, вернется ошибка 412 Precondition Failed.
-
Откройте CLI.
-
Скопируйте объект с условием:
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 объекта.
Объект будет скопирован, если его ETag не совпадает со значением, которое вы укажете в заголовке --copy-source-if-none-match — то есть, если объект был изменен.
Если ETag объекта совпадает, вернется ошибка 412 Precondition Failed.
-
Откройте CLI.
-
Скопируйте объект с условием:
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 объекта.
Удалить объект
Простое удаление
Удаление с условием
-
Откройте CLI.
-
Удалите объект:
aws s3 rm s3://<bucket_name>/<object_name>Укажите:
<bucket_name>— имя бакета;<object_name>— имя объекта.
Вы можете использовать условные запросы при удалении объектов через AWS CLI — это поможет снизить риск случайного удаления файла.
Объект будет удален, если в бакете существует объект c ETag, который совпадает со значением из заголовка If-Match.
Если объект с таким ETag не найден, вернется ошибка 412 Precondition Failed.
-
Откройте CLI.
-
Посмотрите ETag объекта, который должен существовать в бакете, чтобы нужный объект был удален:
aws s3api head-object \
--bucket <bucket_name_1> \
--key <path_to_object_1>Укажите:
<bucket_name_1>— имя бакета, в котором хранится объект;<path_to_object_1>— путь к объекту в бакете.
-
Удалите объект с условием:
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.