Я создаю временные учетные данные через службу токенов безопасности AWS (AWS STS). И используя эти учетные данные для загрузки файла на S3 из S3 JAVA SDK. Мне нужен какой-то способ ограничить размер загружаемого файла. Я пытался добавить политику (s3: content-length-range) при создании пользователя, но, похоже, это не сработало. Есть ли другой способ указать максимальный размер файла, который пользователь может загрузить??
Укажите максимальный размер файла при загрузке файла в AWS S3
Ответы (2)
Я считаю, что нет способа ограничить размер объекта перед загрузкой, и реагировать на это будет довольно сложно. В качестве обходного пути можно создать уведомление о событии S3, которое запускает ваш код через функцию Lambda или тему SNS. Это может подтвердить или удалить объект и, например, уведомить пользователя.
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
)
При тестировании убедитесь, что каждый элемент заголовка совпадает, иначе вы получите неопределенные ошибки отказа в доступе. Это может занять некоторое время, чтобы соответствовать ему полностью.