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:
- ho cercato di utilizzare altre versioni della funzione di autorizzazioni, come
k.set_contents_from_filename(file,policy='public-read')
ok.make_public()
ob.set_acl('public-read',out_name)
ma nessuno di coloro che ha funzionato neanche. - Ho modificato le autorizzazioni sul bucket per dire che tutti erano autorizzati a modificare le autorizzazioni e non funzionava ancora.
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
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
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