Начало работы с AWS S3 API в Yandex Object Storage
AWS S3 API
С помощью AWS S3 API вы создадите бакет, загрузите в него объект, получите список объектов в бакете, скачаете объект из бакета, удалите объект и удалите бакет.
Примечание
Чтобы использовать AWS S3 API напрямую, без SDK и приложений, необходимо самостоятельно подписывать запросы. Процесс формирования запроса и подписи вы можете отработать с помощью AWS CLI в режиме отладки.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Создайте сервисный аккаунт и статический ключ доступа
Для аутентификации в AWS S3 API используется статический ключ доступа. Статический ключ доступа выпускается для сервисного аккаунта, и все действия с использованием ключа выполняются от имени этого сервисного аккаунта.
-
Назначьте сервисному аккаунту роль
storage.editor
на каталог. Это позволит работать от имени этого сервисного аккаунта со всеми бакетами в каталоге. -
Создайте статический ключ доступа.
В результате вы получите данные статического ключа доступа. Для аутентификации в Object Storage вам понадобятся:
key_id
— идентификатор статического ключа доступа;secret
— секретный ключ.
Сохраните
key_id
иsecret
, так как повторное получение значения ключа будет невозможно. -
Установите утилиту curl
.Начиная с версии 8.3.0
, утилитаcurl
при работе с AWS S3 API поддерживает автоматическое формирование строки для подписи, подпись запроса и подстановку необходимых заголовков.При использовании более ранних версий утилиты
curl
вы можете формировать необходимые заголовки и подписывать запросы вручную.
Создайте бакет
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>"
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя создаваемого бакета.
-
Выполните HTTP-запрос:
curl \ --request PUT \ --user "${AWS_KEY_ID}:${AWS_SECRET_KEY}" \ --aws-sigv4 "aws:amz:ru-central1:s3" \ --verbose \ "https://storage.yandexcloud.net/${BUCKET_NAME}"
Результат:
... < HTTP/2 200 < server: nginx < date: Wed, 14 May 2025 20:00:04 GMT < content-type: application/octet-stream < location: /my-sample-bucket < x-amz-request-id: a5cf0b8d******** < * Connection #0 to host storage.yandexcloud.net left intact
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>" DATE_VALUE=`date -R` STRING_TO_SIGN="PUT\n\n${CONTENT_TYPE}\n${DATE_VALUE}\n/${BUCKET_NAME}" SIGNATURE=`echo -en ${STRING_TO_SIGN} | openssl sha1 -hmac ${AWS_SECRET_KEY} -binary | base64`
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя создаваемого бакета.
-
Выполните HTTP-запрос:
curl \ --request PUT \ --verbose \ --header "Host: storage.yandexcloud.net" \ --header "Date: ${DATE_VALUE}" \ --header "Authorization: AWS ${AWS_KEY_ID}:${SIGNATURE}" \ "https://storage.yandexcloud.net/${BUCKET_NAME}"
Результат:
... < HTTP/2 200 < server: nginx < date: Thu, 15 May 2025 07:06:22 GMT < content-type: application/octet-stream < location: /my-sample-bucket < x-amz-request-id: b8c1bd45******** < * Connection #0 to host storage.yandexcloud.net left intact
Загрузите объект в бакет
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" LOCAL_FILE="<путь_к_локальному_файлу>" BUCKET_NAME="<имя_бакета>" OBJECT_PATH="<ключ_объекта>"
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
LOCAL_FILE
— путь к локальному файлу, который вы хотите загрузить. Например:./sample.txt
.BUCKET_NAME
— имя бакета, в который загружается файл.OBJECT_PATH
— ключ, который будет присвоен объекту в бакете. Например:new-prefix/sample-object.txt
.
-
Выполните HTTP-запрос:
curl \ --request PUT \ --user "${AWS_KEY_ID}:${AWS_SECRET_KEY}" \ --aws-sigv4 "aws:amz:ru-central1:s3" \ --upload-file "${LOCAL_FILE}" \ --verbose \ "https://storage.yandexcloud.net/${BUCKET_NAME}/${OBJECT_PATH}"
Результат:
... < HTTP/2 200 < server: nginx < date: Thu, 15 May 2025 07:17:46 GMT < content-type: text/plain < etag: "f75a361db63aa4722fb8e083********" < x-amz-request-id: 40afeceb******** < * Connection #0 to host storage.yandexcloud.net left intact
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" LOCAL_FILE="<путь_к_локальному_файлу>" BUCKET_NAME="<имя_бакета>" OBJECT_PATH="<ключ_объекта>" DATE_VALUE=`date -R` STRING_TO_SIGN="PUT\n\n${CONTENT_TYPE}\n${DATE_VALUE}\n/${BUCKET_NAME}/${OBJECT_PATH}" SIGNATURE=`echo -en ${STRING_TO_SIGN} | openssl sha1 -hmac ${AWS_SECRET_KEY} -binary | base64`
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
LOCAL_FILE
— путь к локальному файлу, который вы хотите загрузить. Например:./sample.txt
.BUCKET_NAME
— имя бакета, в который загружается файл.OBJECT_PATH
— ключ, который будет присвоен объекту в бакете. Например:new-prefix/sample-object.txt
.
-
Выполните HTTP-запрос:
curl \ --request PUT \ --upload-file "${LOCAL_FILE}" \ --verbose \ --header "Host: storage.yandexcloud.net" \ --header "Date: ${DATE_VALUE}" \ --header "Authorization: AWS ${AWS_KEY_ID}:${SIGNATURE}" \ "https://storage.yandexcloud.net/${BUCKET_NAME}/${OBJECT_PATH}"
Результат:
... < HTTP/2 200 < server: nginx < date: Thu, 15 May 2025 07:23:08 GMT < content-type: text/plain < etag: "f75a361db63aa4722fb8e083********" < x-amz-request-id: 67ccce91******** < * Connection #0 to host storage.yandexcloud.net left intact
Получите список объектов в бакете
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>"
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя бакета, список объектов которого требуется получить.
-
Выполните HTTP-запрос:
curl \ --request GET \ --user "${AWS_KEY_ID}:${AWS_SECRET_KEY}" \ --aws-sigv4 "aws:amz:ru-central1:s3" \ --verbose \ "https://storage.yandexcloud.net/${BUCKET_NAME}?list-type=2"
Результат:
... < HTTP/2 200 < server: nginx < date: Thu, 15 May 2025 07:44:41 GMT < content-type: application/xml; charset=UTF-8 < content-length: 569 < x-amz-request-id: cab0999d******** < <?xml version="1.0" encoding="UTF-8"?> * Connection #0 to host storage.yandexcloud.net left intact <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <KeyCount>1</KeyCount> <Name>my-sample-bucket</Name> <Prefix></Prefix> <MaxKeys>1000</MaxKeys> <IsTruncated>false</IsTruncated> <Contents> <Key>text.txt</Key> <LastModified>2025-05-15T07:23:08.030Z</LastModified> <Owner> <ID>ajegtlf2q28a********</ID> <DisplayName>ajegtlf2q28a********</DisplayName> </Owner> <ETag>"f75a361db63aa4722fb8e083********"</ETag> <Size>103</Size> <StorageClass>STANDARD</StorageClass> <TagSet></TagSet> </Contents> </ListBucketResult>
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>" DATE_VALUE=`date -R` STRING_TO_SIGN="GET\n\n${CONTENT_TYPE}\n${DATE_VALUE}\n/${BUCKET_NAME}" SIGNATURE=`echo -en ${STRING_TO_SIGN} | openssl sha1 -hmac ${AWS_SECRET_KEY} -binary | base64`
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя бакета, список объектов которого требуется получить.
-
Выполните HTTP-запрос:
curl \ --request GET \ --verbose \ --header "Host: storage.yandexcloud.net" \ --header "Date: ${DATE_VALUE}" \ --header "Authorization: AWS ${AWS_KEY_ID}:${SIGNATURE}" \ "https://storage.yandexcloud.net/${BUCKET_NAME}?list-type=2"
Результат:
... < HTTP/2 200 < server: nginx < date: Thu, 15 May 2025 08:29:36 GMT < content-type: application/xml; charset=UTF-8 < content-length: 569 < x-amz-request-id: cb4b9a3d******** < <?xml version="1.0" encoding="UTF-8"?> * Connection #0 to host storage.yandexcloud.net left intact <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <KeyCount>1</KeyCount> <Name>my-sample-bucket</Name> <Prefix></Prefix> <MaxKeys>1000</MaxKeys> <IsTruncated>false</IsTruncated> <Contents> <Key>text.txt</Key> <LastModified>2025-05-15T07:23:08.030Z</LastModified> <Owner> <ID>ajegtlf2q28a********</ID> <DisplayName>ajegtlf2q28a********</DisplayName> </Owner> <ETag>"f75a361db63aa4722fb8e083********"</ETag> <Size>103</Size> <StorageClass>STANDARD</StorageClass> <TagSet></TagSet> </Contents> </ListBucketResult>
Скачайте объект из бакета
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>" OBJECT_PATH="<ключ_объекта>" LOCAL_FILE="<путь_к_локальному_файлу>"
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя бакета, в котором находится скачиваемый объект.OBJECT_PATH
— ключ скачиваемого объекта в бакете. Например:new-prefix/sample-object.txt
.LOCAL_FILE
— путь к локальному файлу, в который вы хотите сохранить скачанный объект. Например:./sample.txt
.
-
Выполните HTTP-запрос:
curl \ --request GET \ --user "${AWS_KEY_ID}:${AWS_SECRET_KEY}" \ --aws-sigv4 "aws:amz:ru-central1:s3" \ --verbose \ "https://storage.yandexcloud.net/${BUCKET_NAME}/${OBJECT_PATH}" \ > ${LOCAL_FILE}
Результат:
... < HTTP/2 200 < server: nginx < date: Thu, 15 May 2025 08:55:19 GMT < content-type: text/plain < content-length: 103 < accept-ranges: bytes < etag: "f75a361db63aa4722fb8e083********" < last-modified: Thu, 15 May 2025 07:23:08 GMT < x-amz-request-id: 1afc3ec9******** < { [103 bytes data] 100 103 100 103 0 0 1925 0 --:--:-- --:--:-- --:--:-- 1943 * Connection #0 to host storage.yandexcloud.net left intact
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>" OBJECT_PATH="<ключ_объекта>" LOCAL_FILE="<путь_к_локальному_файлу>" DATE_VALUE=`date -R` STRING_TO_SIGN="GET\n\n${CONTENT_TYPE}\n${DATE_VALUE}\n/${BUCKET_NAME}/${OBJECT_PATH}" SIGNATURE=`echo -en ${STRING_TO_SIGN} | openssl sha1 -hmac ${AWS_SECRET_KEY} -binary | base64`
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя бакета, в котором находится скачиваемый объект.OBJECT_PATH
— ключ скачиваемого объекта в бакете. Например:new-prefix/sample-object.txt
.LOCAL_FILE
— путь к локальному файлу, в который вы хотите сохранить скачанный объект. Например:./sample.txt
.
-
Выполните HTTP-запрос:
curl \ --request GET \ --verbose \ --header "Host: storage.yandexcloud.net" \ --header "Date: ${DATE_VALUE}" \ --header "Authorization: AWS ${AWS_KEY_ID}:${SIGNATURE}" \ "https://storage.yandexcloud.net/${BUCKET_NAME}/${OBJECT_PATH}" \ > ${LOCAL_FILE}
Результат:
... < HTTP/2 200 < server: nginx < date: Thu, 15 May 2025 09:11:12 GMT < content-type: text/plain < content-length: 103 < accept-ranges: bytes < etag: "f75a361db63aa4722fb8e083********" < last-modified: Thu, 15 May 2025 07:23:08 GMT < x-amz-request-id: e86c7119******** < { [103 bytes data] 100 103 100 103 0 0 3433 0 --:--:-- --:--:-- --:--:-- 3433 * Connection #0 to host storage.yandexcloud.net left intact
Скачанный объект сохранен в файл, путь к которому задан в переменной LOCAL_FILE
.
Удалите объект в бакете
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>" OBJECT_PATH="<ключ_объекта>"
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя бакета, из которого удаляется объект.OBJECT_PATH
— ключ удаляемого объекта в бакете. Например:new-prefix/sample-object.txt
.
-
Выполните HTTP-запрос:
curl \ --request DELETE \ --user "${AWS_KEY_ID}:${AWS_SECRET_KEY}" \ --aws-sigv4 "aws:amz:ru-central1:s3" \ --verbose \ "https://storage.yandexcloud.net/${BUCKET_NAME}/${OBJECT_PATH}"
Результат:
... < HTTP/2 204 < server: nginx < date: Thu, 15 May 2025 14:24:01 GMT < x-amz-request-id: 7d2f023c******** < * Connection #0 to host storage.yandexcloud.net left intact
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>" OBJECT_PATH="<ключ_объекта>" DATE_VALUE=`date -R` STRING_TO_SIGN="DELETE\n\n${CONTENT_TYPE}\n${DATE_VALUE}\n/${BUCKET_NAME}/${OBJECT_PATH}" SIGNATURE=`echo -en ${STRING_TO_SIGN} | openssl sha1 -hmac ${AWS_SECRET_KEY} -binary | base64`
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя бакета, из которого удаляется объект.OBJECT_PATH
— ключ удаляемого объекта в бакете. Например:new-prefix/sample-object.txt
.
-
Выполните HTTP-запрос:
curl \ --request DELETE \ --verbose \ --header "Host: storage.yandexcloud.net" \ --header "Date: ${DATE_VALUE}" \ --header "Authorization: AWS ${AWS_KEY_ID}:${SIGNATURE}" \ "https://storage.yandexcloud.net/${BUCKET_NAME}/${OBJECT_PATH}"
Результат:
... < HTTP/2 204 < server: nginx < date: Thu, 15 May 2025 14:30:28 GMT < x-amz-request-id: 7dc0c426******** < * Connection #0 to host storage.yandexcloud.net left intact
Удалите бакет
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>"
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя удаляемого бакета. Удаляемый бакет не должен содержать объектов.
-
Выполните HTTP-запрос:
curl \ --request DELETE \ --user "${AWS_KEY_ID}:${AWS_SECRET_KEY}" \ --aws-sigv4 "aws:amz:ru-central1:s3" \ --verbose \ "https://storage.yandexcloud.net/${BUCKET_NAME}"
Результат:
... < HTTP/2 204 < server: nginx < date: Thu, 15 May 2025 14:35:57 GMT < x-amz-request-id: 6a13b7ae******** < * Connection #0 to host storage.yandexcloud.net left intact
-
Задайте переменные, содержащие необходимые данные:
AWS_KEY_ID="<идентификатор_статического_ключа>" AWS_SECRET_KEY="<секретный_ключ>" BUCKET_NAME="<имя_бакета>" DATE_VALUE=`date -R` STRING_TO_SIGN="DELETE\n\n${CONTENT_TYPE}\n${DATE_VALUE}\n/${BUCKET_NAME}" SIGNATURE=`echo -en ${STRING_TO_SIGN} | openssl sha1 -hmac ${AWS_SECRET_KEY} -binary | base64`
Где:
AWS_KEY_ID
— идентификатор статического ключа доступа.AWS_SECRET_KEY
— секретный ключ.
BUCKET_NAME
— имя удаляемого бакета. Удаляемый бакет не должен содержать объектов.
-
Выполните HTTP-запрос:
curl \ --request DELETE \ --verbose \ --header "Host: storage.yandexcloud.net" \ --header "Date: ${DATE_VALUE}" \ --header "Authorization: AWS ${AWS_KEY_ID}:${SIGNATURE}" \ "https://storage.yandexcloud.net/${BUCKET_NAME}"
Результат:
... < HTTP/2 204 < server: nginx < date: Thu, 15 May 2025 14:39:15 GMT < x-amz-request-id: 331b2dc4******** < * Connection #0 to host storage.yandexcloud.net left intact