2013-09-30 12 views
5

Ho cercato di trovare una soluzione a questo per circa 36 ore, quindi spero di non duplicare una domanda o di chiedere qualcosa di ovvio. Sto costruendo una web app che deve manipolare i file che immagazzino in S3 e rimettere le nuove versioni in S3 con un acl 'public-read'. Quindi una pagina diversa consente di visualizzare il file aggiornato. L'app è presente su un server Amazon EC2 e si connette a un bucket S3 amazon.Impossibile impostare i permessi dei file in S3 usando boto e django

Sto usando django, sedano e boto per farlo. Ho una configurazione di sedici task che ottiene alcune informazioni da una delle mie viste e fa l'elaborazione e quindi invia il nuovo file a S3. Sono in grado di ottenere il file originale da S3, manipolarlo correttamente e ripubblicarlo su S3. L'unica cosa che sembra non funzionare è la modifica delle autorizzazioni su quel file. Quindi tutto funziona eccetto quando vai alla pagina di visualizzazione, ottengo un errore 403 (Proibito) quando provo ad accedere a quel file.

Se vado personalmente in S3 e cambio il permesso su quel file perché tutti possano leggerlo, tutto funziona. Prima di andare avanti, il codice che uso nel mio compito che quasi funziona è:

name = 'filename.blah' 
conn = boto.connect_s3() 
b = conn.get_bucket(settings.AWS_STORAGE_BUCKET_NAME) 
grab_from_S3(name,b) # grab file from S3 
out_name = conv(name) 
send_to_S3(out_name,b) 

dove le funzioni in ci sono:

def grab_from_S3(file,bucket): 
    k = Key(bucket) 
    k.key = file 
    k.get_contents_to_filename(file) 

def send_to_S3(file,bucket): 
    k = Key(bucket) 
    k.key = file 
    k.set_contents_from_filename(file) 
    k.set_acl('public-read') 

e conv (nome) solo che alcune cose di conversione. Quindi questo funziona quasi fino a quando le autorizzazioni del file non sono "public-read". Tutte le credenziali di AWS e il nome del bucket presumo vengano importati correttamente dall'ambiente perché è in grado di inviare e spostare file da e verso S3.

La parte più confusa è che quando apro un ambiente python dal venv sul mio server EC2 o solo dal python che è stato installato su di esso per cominciare e eseguo tutti i comandi che mostro sopra, FUNZIONA . Posso cambiare il permesso senza problemi. E quando l'attività viene eseguita non genera errori nei registri di sedici, quindi non penso che l'attività stia effettivamente correndo in errori. Semplicemente non sta cambiando quello che dovrebbe cambiare.

cose che ho provato:

  1. ho cercato di utilizzare altre versioni della funzione di autorizzazioni, come k.set_contents_from_filename(file,policy='public-read') o k.make_public() o b.set_acl('public-read',out_name) ma nessuno di coloro che ha funzionato neanche.
  2. Ho modificato le autorizzazioni sul bucket per dire che tutti erano autorizzati a modificare le autorizzazioni e non funzionava ancora.
  3. Ho provato a cambiare la politica secchio per questo qui sotto e ha fatto nessun effetto:

    { "Version": "2008-10-17", "Id": "whatever", "Statement": [ { "Sid": "whatever", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "s3:PutObjectAcl", "s3:PutObject"], "Resource": [ "arn:aws:s3:::bucket_name", "arn:aws:s3:::bucket_name/*" ] } ] }

Alla fine, sono davvero confuso perché riesco a fare tutto questo bene da un ambiente python sulla stessa istanza EC2 ma non il codice in esecuzione su quell'istanza. Ho cercato e cercato e non sono stato in grado di trovare alcun suggerimento che funzionasse. Un'altra informazione utile (ma potrebbe essere irrilevante a seconda del problema) è che se provo a connettermi a S3 nella mia vista facendo comandi simili sopra restituisce un errore:

"Nessun gestore era pronto per autenticare . Sono stati controllati 1 gestori.['HmacAuthV1Handler'] Controlla le tue credenziali "

anche se funziona quando quei comandi vengono eseguiti nel mio compito (suppongo che fosse la chiave di accesso o la chiave di accesso segreta o qualcosa del genere, ma funziona con tutto il resto). Penso che sto facendo le importazioni corrette nel codice python delle parti della libreria boto di cui ho bisogno

Ho appena impostato questa istanza in modo che abbia probabilmente quasi la versione più recente di boto, sedano, django, ecc. Probabilmente ho dimenticato qualcosa.Per favore fatemi sapere se avete bisogno di ulteriori informazioni per rispondere alla domanda.Non sono davvero sicuro di cosa stia succedendo

Grazie mille in anticipo

+0

Un sacco di domande lì 8 ^) In particolare, per impostare l'ACL sulla tua chiave, prova a fare: k.set_contents_from_filename (file, policy = 'public-read'). Ciò consente di impostare l'ACL nel momento in cui si sta scrivendo il file anziché in un'operazione separata. – garnaat

+0

Ciao Garnaat, grazie per il suggerimento. Nella sezione "Le cose che ho provato", ho detto che avevo provato a fare tutte le varianti per impostare la chiave per "public-read". Quello che hai suggerito è quello che ho provato. È sicuramente un buon suggerimento, ma ancora non funziona. La cosa che mi confonde veramente è che qualsiasi delle varianti funziona da un ambiente python. E nessuno funziona dal codice in tasks.py. Grazie per il suggerimento! – barragan

risposta

7

Ho risolto il problema da solo dopo circa 4 giorni e la risposta era proprio sotto il mio naso per tutto il tempo. Quindi, per il bene di chiunque altro possa accadere in tutto questo, esporrò la mia stupidità.

Sono molto molto nuovo per il sedano. Quello di cui non mi rendevo conto è che ogni volta che apporti una modifica alle tue attività di sedano, i tuoi lavoratori devono essere riavviati affinché possano vedere i cambiamenti. Questo non è mai stato un problema per me perché ho sempre iniziato a lavorare da solo ogni volta che stavo sviluppando, ma di recente ho iniziato a usare il sedano come demone. Quindi questo è stato il primo cambiamento che ho fatto in cui il sedano stava girando per tutto il tempo.

La risposta era che avevo solo bisogno di riavviare il demone in modo che vedesse i miei comandi. Funziona tutto ora. Sono andato e ho cercato di cercare una riga nella documentazione di sedano o di iniziare le guide su come ricordarsi di fare questo quando apporti modifiche o che il codice è stato importato ma non hai visto nulla di ovvio. Ho trovato questo attraverso alcuni altre risposte:

http://docs.celeryproject.org/en/latest/internals/reference/celery.worker.autoreload.html

che può essere utile per lo sviluppo. Ma non ho visto alcuna linea esplicita che dicesse a nuove persone di sedano per assicurarsi che siano consapevoli di dover riavviare i lavoratori. Forse questo è ovvio, e io sono semplicemente troppo nuovo. Se qualcuno sa dove c'è un collegamento ad alcune informazioni su di esso, questo sarebbe un post di benvenuto a questo come qualcuno potrebbe voler leggerlo in futuro. Scusa per aver sprecato il tempo di tutti.