2015-01-29 20 views
8

Sto usando Boto per provare a ottenere un bucket in Amazon S3, ma restituisce Bad Request quando uso get_bucket() per alcuni di i secchi. Sto iniziando a chiedermi se questo è un bug con Boto, dato che posso ottenere il bucket usando get_all_buckets().get_bucket() restituisce 'Bad Request' per i bucket S3 che non ho creato tramite Boto

>>> from boto.s3.connection import S3Connection 
>>> conn = S3Connection(S3_ACCESS_KEY, S3_SECRET_KEY) 
>>> buckets = conn.get_all_buckets() 
>>> buckets 
[<Bucket: mysite-backups>] 
>>> buckets[0] 
<Bucket: mysite-backups> 
>>> conn.get_bucket('mysite-backups') 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/path/to/virtualenv/lib/python2.7/site-packages/boto/s3/connection.py", line 502, in get_bucket 
    return self.head_bucket(bucket_name, headers=headers) 
    File "/path/to/virtualenv/lib/python2.7/site-packages/boto/s3/connection.py", line 549, in head_bucket 
    response.status, response.reason, body) 
S3ResponseError: S3ResponseError: 400 Bad Request 

>>> conn.create_bucket('mysite_mybucket') 
<Bucket: mysite_mybucket> 
>>> conn.get_bucket('mysite_mybucket') 
<Bucket: mysite_mybucket> 

questo sembra essere un problema, anche se entro con lo stesso account utente come sto usando le creds di accesso per e creare dall'interno della console AWS.

Qualche idea sul perché questo potrebbe accadere?

risposta

15

Risulta che il problema è dovuto alla regione (stavo usando Francoforte). Due modi di trattare con esso:

  1. rinunciare a Francoforte (punti @andpei fuori ci sono issues currently reported with it) e ricreare il secchio in una regione diversa.

  2. specificare l'area utilizzando il parametro 'host' per il collegamento (grazie @Siddarth):

    >>> REGION_HOST = 's3.eu-central-1.amazonaws.com' 
    >>> conn = S3Connection(S3_ACCESS_KEY, S3_SECRET_KEY, host=REGION_HOST) 
    >>> conn.get_bucket('mysite-backups') 
    <Bucket: mysite-backups> 
    

    È possibile trovare l'host regione in questione here.

+2

Francoforte richiedere SSL SIGv4, vedi https://github.com/boto/boto/issues/2741 – andpei

2

Utilizzare connect to region mentre si gestiscono bucket in regioni diverse.

1

Una soluzione generale e semplice, che non comporta il cambiamento di regione o l'impostazione di un host specifico, si trova a https://github.com/boto/boto/issues/2916. Dopo qualche modifica:

La regione di Francoforte AWS (Irlanda e CN troppo, a quanto pare) supportano solo l'algoritmo di firma V4. (...)

Per la documentazione boto, è possibile aggiungere [s3] use-sigv4 = True al file ~/.boto o impostare la lista os.environ per includere S3_USE_SIG_V4: os.environ['S3_USE_SIGV4'] = 'True'.

0

ho dovuto usare una combinazione di EOL e seddonym delle risposte - prima ho specificato che mi piacerebbe usare Sigv4 con il seguente:

os.environ['S3_USE_SIGV4'] = 'True' 

Poi, nel collegare al secchio ho dovuto specificare il padrone di casa, che sembrava un po 'sciocco, ma qui va:

s3 = S3Connection('key id', 'access key', host='s3.eu-central-1.amazonaws.com') 

si noti che questo è per Francoforte solo

1

Add s3 secchio host per la connessione boto

conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, host=AWS_HOST)

Problemi correlati