Presigned URL в S3 позволяет временно предоставить доступ к объекту в хранилище без необходимости изменять права доступа на объект. Это удобный инструмент для скачивания файлов сторонними пользователями. В статье рассмотрим, как создать Presigned URL двумя способами: через панель управления и с использованием AWS CLI.
Через панель управления
Генерация Presigned URL доступна только для приватных бакетов. Чтобы сгенерировать Presigned URL, перейдите в раздел «Объекты» в нужном бакете. Наведите курсор на объект, для которого требуется создать ссылку, и нажмите на кнопку «Ссылка на файл».
Ссылка будет скопирована в буфер обмена и активна в течение 60 минут. После истечения этого времени при попытке перехода по ссылке будет возвращаться ошибка 403. В панели управления нельзя изменить продолжительность времени, на протяжении которого ссылка будет активна.
Ссылку также можно сгенерировать для конкретной версии объекта, если в бакете
Через AWS CLI
Создать Presigned URL с помощью AWS CLI можно с помощью команды:
aws s3 presign s3://<бакет>/<объект> --expires-in 60 --endpoint-url https://s3.twcstorage.ru
Параметр --expires-in
необязателен. Он определяет время доступности объекта по ссылке в секундах. Если параметр не указан, объект будет доступен в течение 3600 секунд (1 час).
#!/usr/bin/env python3
import argparse
import boto3
parser = argparse.ArgumentParser()
parser.add_argument('--bucket', required=True)
parser.add_argument('--key', required=True)
parser.add_argument('--expires-in', type=int, default=3600)
parser.add_argument('--version-id')
parser.add_argument('--method', default='get_object')
args = parser.parse_args()
client = boto3.client('s3', endpoint_url='https://s3.twcstorage.ru')
params = {'Bucket': args.bucket, 'Key': args.key}
if args.version_id:
params.update({'VersionId': args.version_id})
url = client.generate_presigned_url(args.method, Params=params, ExpiresIn=args.expires_in)
print(url)
Скрипт запускается командой:
python ./main.py --bucket имя_бакета --key имя_объекта --expires-in 6969 --version-id версия_объекта
Где:
-
--expires-in
— время в секундах, через которое ссылка перестанет работать. -
--version-id
— версия объекта (VersionId
), которую можно получить, например, с помощью AWS CLI.
Данные для авторизации скрипт возьмет из файла ~/.aws/credentials
Генерация Presigned URL до загрузки объекта
Вы можете заранее сгенерировать ссылку для загрузки объекта — даже если сам объект еще не существует в бакете.
Стандартные утилиты вроде 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" "ссылка_полученная_при_выполнении_скрипта"