Presigned URL в S3 позволяет временно предоставить доступ к объекту в хранилище без необходимости изменять права доступа на объект. Это удобный инструмент для скачивания файлов сторонними пользователями. В статье рассмотрим, как создать Presigned URL двумя способами: через панель управления и с использованием AWS CLI.
Генерация Presigned URL доступна только для приватных бакетов. Чтобы сгенерировать Presigned URL, перейдите в раздел «Объекты» в нужном бакете. Наведите курсор на объект, для которого требуется создать ссылку, и нажмите на кнопку «Ссылка на файл».
Ссылка будет скопирована в буфер обмена и активна в течение 60 минут. После истечения этого времени при попытке перехода по ссылке будет возвращаться ошибка 403. В панели управления нельзя изменить продолжительность времени, на протяжении которого ссылка будет активна.
Создать Presigned URL с помощью AWS CLI можно с помощью команды:
aws s3 presign s3://<бакет>/<объект> --expires-in 60 --endpoint-url https://s3.twcstorage.ru
Параметр --expires-in
необязателен. Он определяет время доступности объекта по ссылке в секундах. Если параметр не указан, объект будет доступен в течение 3600 секунд (1 час).
Вы можете заранее сгенерировать ссылку для загрузки объекта — даже если сам объект еще не существует в бакете.
Стандартные утилиты вроде AWS CLI не поддерживают генерацию Presigned URL для загрузки, однако это можно реализовать с помощью SDK. Например, через boto3
для Python.
Пример скрипта:
import boto3
from botocore.client import Config
# Укажите на ваши данные
AWS_ACCESS_KEY_ID = 'S3 Access Key'
AWS_SECRET_ACCESS_KEY = 'S3 Secret Access Key'
BUCKET_NAME = 'Имя бакета'
OBJECT_KEY = 'example.txt' # имя будущего объекта
EXPIRES_IN = 3600 # срок действия ссылки в секундах
s3 = boto3.client(
's3',
endpoint_url='https://s3.twcstorage.ru',
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
config=Config(signature_version='s3v4'),
region_name='ru-1'
)
# Генерация presigned URL
url = s3.generate_presigned_url(
ClientMethod='put_object',
Params={
'Bucket': BUCKET_NAME,
'Key': OBJECT_KEY,
},
ExpiresIn=EXPIRES_IN
)
print(url)
Указывать Content-Type
при генерации ссылки не нужно, так как его передача может привести к ошибке.
В результате выполнения скрипта будет сгенерирована временная ссылка для загрузки объекта.
Загрузить файл можно с помощью curl
:
curl -X PUT -T путь/до/загружаемого_файла.txt -H "Content-Type: text/plain" "ссылка_полученная_при_выполнении_скрипта"