<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Managed Kubernetes — разверните готовый кластер за 5 минут →
Вход / Регистрация
На главную
25eb9e0a-a5a8-472a-ace7-940b8bd2adf0
Облачные сервисы

Presigned URL

Presigned URL в S3 позволяет временно предоставить доступ к объекту в хранилище без необходимости изменять права доступа на объект. Это удобный инструмент для скачивания файлов сторонними пользователями. В статье рассмотрим, как создать Presigned URL двумя способами: через панель управления и с использованием AWS CLI.

Через панель управления

Генерация Presigned URL доступна только для приватных бакетов. Чтобы сгенерировать Presigned URL, перейдите в раздел «Объекты» в нужном бакете. Наведите курсор на объект, для которого требуется создать ссылку, и нажмите на кнопку «Ссылка на файл». 

Selection 143

Ссылка будет скопирована в буфер обмена и активна в течение 60 минут. После истечения этого времени при попытке перехода по ссылке будет возвращаться ошибка 403. В панели управления нельзя изменить продолжительность времени, на протяжении которого ссылка будет активна.

Ссылку также можно сгенерировать для конкретной версии объекта, если в бакете включено версионирование. Для этого откройте историю версий объекта и нажмите кнопку «Ссылка на файл» рядом с нужной версией.

Scr 20250904 Qgda

Через AWS CLI

Создать Presigned URL с помощью AWS CLI можно с помощью команды:

aws s3 presign s3://<бакет>/<объект> --expires-in 60 --endpoint-url https://s3.twcstorage.ru

Параметр --expires-in необязателен. Он определяет время доступности объекта по ссылке в секундах. Если параметр не указан, объект будет доступен в течение 3600 секунд (1 час).

Генерация Presigned URL для версии объекта, отличной от текущей, не поддерживается стандартными утилитами. Поэтому для создания ссылки на конкретную версию объекта можно воспользоваться самописными скриптами. Например, вы можете использовать следующий скрипт:

#!/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" "ссылка_полученная_при_выполнении_скрипта"
Была ли статья полезна?
Ваша оценка очень важна
Пока нет комментариев