Укажите максимальный размер файла при загрузке файла в AWS S3

Я создаю временные учетные данные через службу токенов безопасности AWS (AWS STS). И используя эти учетные данные для загрузки файла на S3 из S3 JAVA SDK. Мне нужен какой-то способ ограничить размер загружаемого файла. Я пытался добавить политику (s3: content-length-range) при создании пользователя, но, похоже, это не сработало. Есть ли другой способ указать максимальный размер файла, который пользователь может загрузить??


person Ankit Choudhary    schedule 03.11.2017    source источник
comment
Привет, добро пожаловать в SO. Пожалуйста, опубликуйте свой код, чтобы другие люди могли взглянуть на то, что вы уже пробовали, а затем посоветовать решение.   -  person andrey.shedko    schedule 03.11.2017


Ответы (2)


Я считаю, что нет способа ограничить размер объекта перед загрузкой, и реагировать на это будет довольно сложно. В качестве обходного пути можно создать уведомление о событии S3, которое запускает ваш код через функцию Lambda или тему SNS. Это может подтвердить или удалить объект и, например, уведомить пользователя.

person Julio Faerman    schedule 03.11.2017
comment
Но я считаю, что в политике POST на основе браузера мы можем указать диапазон длины содержимого, что может ограничить загрузку больших файлов. То же самое не умеет в SDK. - person Ankit Choudhary; 03.11.2017
comment
content-length-range, предложенный в вопросе, является условием политики POST HTML-формы (не условием политики IAM). Загрузки с использованием предварительно подписанных форм поддерживают такое ограничение, но это единственный такой механизм. docs.aws.amazon.com/AmazonS3/latest/API/ - person Michael - sqlbot; 03.11.2017

Альтернативным методом может быть создание предварительно подписанного URL-адреса вместо временных учетных данных. Это будет хорошо для одного файла с указанным вами именем. Вы также можете задать диапазон длины содержимого при создании URL-адреса. Ваш пользователь получит URL-адрес и должен будет использовать определенный метод (POST/PUT/и т. д.) для запроса. Они устанавливают контент, пока вы устанавливаете все остальное.

Я не знаю, как это сделать с помощью Java (это не поддерживает условия), но это просто с Python и boto3:

import boto3

# Get the service client
s3 = boto3.client('s3')

# Make sure everything posted is publicly readable
fields = {"acl": "private"}

# Ensure that the ACL isn't changed and restrict the user to a length
# between 10 and 100.
conditions = [
    {"acl": "private"},
    ["content-length-range", 10, 100]
]

# Generate the POST attributes
post = s3.generate_presigned_post(
    Bucket='bucket-name',
    Key='key-name',
    Fields=fields,
    Conditions=conditions
)

При тестировании убедитесь, что каждый элемент заголовка совпадает, иначе вы получите неопределенные ошибки отказа в доступе. Это может занять некоторое время, чтобы соответствовать ему полностью.

person kichik    schedule 03.11.2017