2014-09-01 3 views
4

Я использую Python и tinys3 для записи файлов на S3, но он не работает. Вот мой код:Загрузить на Amazon S3 с помощью tinys3

import tinys3 
conn = tinys3.Connection('xxxxxxx','xxxxxxxx',tls=True) 

f = open('testing_s3.txt','rb') 
print conn.upload('testing_data/testing_s3.txt',f,'testing-bucket') 
print conn.get('testing_data/testing_s3.txt','testing-bucket') 

Это дает выход:

<Response [301]> 
<Response [301]> 

При попытке с указанием конечной точки, я получаю:

requests.exceptions.HTTPError: 403 Client Error: Forbidden 

Любая идея, что я делаю не так?

Редактировать: Когда я пытаюсь использовать boto, он работает, поэтому проблема не в ключе доступа или секретном ключе.

ответ

12

Я, наконец, понял это. Вот правильный код:

import tinys3 
conn = tinys3.Connection('xxxxxxx','xxxxxxxx',tls=True,endpoint='s3-us-west-1.amazonaws.com') 

f = open('testing_s3.txt','rb') 
print conn.upload('testing_data/testing_s3.txt',f,'testing-bucket') 
print conn.get('testing_data/testing_s3.txt','testing-bucket') 

Вы должны использовать конечную точку региона, а не s3.amazonaws.com. Вы можете посмотреть конечную точку региона отсюда: http://docs.aws.amazon.com/general/latest/gr/rande.html. Посмотрите под заголовком «Amazon Simple Storage Service (S3)».

Я получил идею этой темы: https://github.com/smore-inc/tinys3/issues/5

+2

Работал и для меня. –

+0

@ jm9k Я не понимаю, откуда взялся ключ. Откуда мне это взять? – 2016-12-16 14:57:30

+2

@Dex 'ter Ключ - это ключ доступа AWS. Вы создаете это в области управления AWAM IAM. –

2

При использовании IAM пользователя необходимо разрешить «s3: PutObjectAcl» действие.

0

Не знаю, почему, но этот код никогда не работал для меня. Я переключился на boto, и он просто загрузил файл с 1 раза.

AWS_ACCESS_KEY_ID = 'XXXXXXXXXXXXXXXXXXXXX' 
    AWS_SECRET_ACCESS_KEY = 'XXXXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXX' 

    bucket_name = 'my-bucket' 
    conn = boto.connect_s3(AWS_ACCESS_KEY_ID, 
      AWS_SECRET_ACCESS_KEY) 

    bucket = conn.get_bucket('my-bucket') 

    print 'Uploading %s to Amazon S3 bucket %s' % \ 
    (filename, bucket_name) 

    k = Key(bucket) 
    k.key = filename 
    k.set_contents_from_filename(filename, 
     cb=percent_cb, num_cb=10) 
Смежные вопросы