2014-12-10 14 views
9

Ho un problema con l'utilizzo di Python-Boto SDK per i bucket S3 per la regione Frankfurt. Secondo Amazon link questa regione supporterà solo V4. Questo document spiega come aggiungere il supporto V4 per Boto SDK. Ho aggiunto una nuova sezione:Utilizzo di boto per i bucket AWS S3 per Signature V4

if not boto.config.get('s3', 'use-sigv4'): 
    boto.config.add_section('s3') 
    boto.config.set('s3', 'use-sigv4', 'True') 

e nuova connessione poi ho creato e ottenuto tutti i secchi:

connection = S3Connection(accesskey, secretkey, host=S3Connection.DefaultHost) 
buckets = connection.get_all_buckets() 

funziona benissimo, ma poi ho trovato a tutti i tasti per il mio secchio:

for bucket in buckets: 
    bucket.get_all_keys() 

ed ho ottenuto il seguente:

S3ResponseError: 400 Bad Request 
<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-central-1'</Message><Region>eu-central-1</Region> 

Perché si è verificato? Dopo che ho collegato alla regione e ha ottenuto tutti i dati necessari:

region_con = boto.s3.connect_to_region('eu-central-1', aws_access_key_id=accesskey, aws_secret_access_key=secretkey) 
bucket = region_con.get_bucket(bucket.name) 
bucket.get_all_keys() 

Come posso risolvere il problema in modo corretto?

+0

Cosa succede se si apportano effettivamente le modifiche nel file di configurazione di boto anziché cercare di farlo a livello di programmazione? – garnaat

+0

Sì, l'ho provato prima, ma ho ottenuto lo stesso risultato. Che differenza dovrebbe avere il tuo approccio? – Oleg

+0

Probabilmente nessuno, ma si modifica solo il valore della configurazione in memoria nel proprio ambiente. Se un'altra configurazione è stata creata da qualche altra parte, non otterrebbe gli aggiornamenti perché leggerà la configurazione direttamente dal file di configurazione. Mi chiedevo solo se questo avrebbe fatto la differenza. – garnaat

risposta

6

Ho avuto lo stesso problema con Boto. La regione era Francoforte e ha avuto errori riguardo alle regioni sbagliate. La soluzione per me era solo per puntare un host (un URI ottenuto da questa pagina http://docs.aws.amazon.com/general/latest/gr/rande.html) per 's3.eu-central-1.amazonaws.com' invece di inadempienza 's3.amazonaws.com'

s3 = boto.s3.connect_to_region('eu-central-1', 
           aws_access_key_id=accesskey, 
           aws_secret_access_key=secretkey, 
           host='s3.eu-central-1.amazonaws.com') 
2

provare a rimuovere s3 da boto config, seguente codice funziona per me

if 's3' in boto.config.sections(): boto.config.remove_section('s3')

-1

risposta di HSRV sopra lavori per boto 2. per boto3, il seguente è grosso modo equivalenti:

0.123.
s3 = boto3.client('s3', region_name='eu-central-1') 

In alternativa, è possibile impostare il campo region nel .aws/config:

[default] 
output = json 
region = eu-central-1 

Imposta la regione di default; puoi ancora scegliere una regione specifica in Python come sopra.

Il significato della regione varia da servizio a servizio (ad esempio, supponendo che non si sia seduti in un VPC, è possibile accedere a un bucket S3 da qualsiasi luogo). In questo caso, tuttavia, l'importante è che le regioni più recenti (come Francoforte) supportino solo lo schema di autenticazione più recente (AWS4-HMAC-SHA256). Boto si imbatte in problemi se si tenta di connettersi a qualsiasi cosa in una regione del genere da una regione che utilizza ancora il vecchio schema (come Dublino).

+0

Non è una risposta. Stai uscendo da Francoforte, invece di suggerire il modo di abilitare V4. –

+0

La domanda riguardava l'accesso ai secchi S3 a Francoforte usando boto. Specificare esplicitamente la regione di Francoforte è un modo per farlo (abilitare l'autenticazione v4 è un'altra). –

Problemi correlati