2016-08-20 1 views
0

У меня есть веб-приложение django, и я хочу разрешить ему загружать файлы из моего s3-ведра. Файлы не являются общедоступными. У меня есть политика IAM для доступа к ним. Проблема в том, что я делаю NOT хочу загрузить файл на сервере приложений django, а затем загрузить его для загрузки на клиент. Это похоже на загрузку дважды. Я хочу, чтобы иметь возможность загружать непосредственно на клиента приложения django. Кроме того, я не считаю безопасным передавать мои учетные данные IAM в HTTP-запросе, поэтому я думаю, что мне нужно использовать временный токен. Я читал: http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.htmlКак загрузить файл из s3-ведра с временным токеном в python

но я просто не понимаю, как создать временный токен на лету. Решение python (возможно, с помощью boto) было бы оценено.

+1

https://www.whitneyindustries.com/aws/2014/ 11/16/boto-plus-s3-plus-sts-tokens.html –

+0

@NehalJWani Фактически в загруженном файле есть ошибка, указывающая на отсутствие AWSAccessKey. Я передал свой AWSAccessKey в url и передал токен в заголовке. – max

ответ

4

С Boto (2) должно быть очень просто создать URL-адреса с ограничением по времени, если ваша политика IAM имеет соответствующие разрешения. Я использую этот подход для подачи видеороликов зарегистрированным пользователям из частного ведра S3.

from boto.s3.connection import S3Connection 
conn = S3Connection('<aws access key>', '<aws secret key>') 
bucket = conn.get_bucket('mybucket') 
key = bucket.get_key('mykey', validate=False) 
url = key.generate_url(86400) 

Это будет генерировать URL для загрузки ключа foo в данном ведре, который действителен в течение 86400 секунд, то есть 24 часа. Без validate=False Boto 2 проверяет, что ключ фактически существует в ковше в первую очередь, а если нет, генерирует исключение. С помощью этих серверов контролируемых файлов часто ненужный дополнительный шаг, таким образом validate=False в примере


В Boto3 the API is quite different:

s3 = boto3.client('s3') 

# Generate the URL to get 'key-name' from 'bucket-name' 
url = s3.generate_presigned_url(
    ClientMethod='get_object', 
    Params={ 
     'Bucket': 'mybucket', 
     'Key': 'mykey' 
    }, 
    expires=86400 
) 
+0

Отлично. Благодарю. так что «проверять» означает перезапись? – max

+0

@max no, это для загрузки URL-адресов. Если вы пропустили проверку (по умолчанию - «Истина»), то boto2 фактически проверит, существует ли ключ и выбрасывает исключение, если в ковке нет ключа. –

+0

что такое «mykey»? Я попытался заменить mykey своим именем, и это не позволило мне скачать. – max

Смежные вопросы