2013-09-30 20 views
5

Bunun için yaklaşık 36 saat boyunca bir çözüm bulmaya çalışıyorum, bu yüzden umarım ki bir soruyu kopyalamıyorum veya açık bir şey sormuyorum. S3'te sakladığım dosyaları değiştirmek ve S3'te 'public-read' acl ile yeni sürümleri geri yüklemek zorunda olan bir web uygulaması yapıyorum. Sonra farklı bir sayfa güncellenmiş dosyayı görüntülemenizi sağlar. Uygulama bir amazon EC2 sunucusunda var ve bir amazon S3 kepçesine bağlanıyor.Boto ve django kullanarak S3'te dosya izinleri ayarlanamıyor

Bunu yapmak için django, kereviz ve boto kullanıyorum. Görünümlerimden birinden bilgi alan ve işlemeyi yapan ve yeni dosyayı S3'e gönderen bir kereviz görevim var. Orijinal dosyayı S3'ten alıp, başarılı bir şekilde manipüle edebilir ve S3’e gönderebilirim. Çalışmıyor gibi görünen tek şey, o dosyadaki izinleri değiştirmektir. Yani her şey görüntüleme sayfasına gittiğinizde çalışır, bu dosyaya erişmeye çalışırken 403 (Yasak) hatası alıyorum.

S3'e kendim girersem ve herkesin okuması için bu dosyadaki izni değiştirirseniz, her şey çalışır. Devam etmeden önce, neredeyse çalışır benim görev kullanmak kodudur: işlevleri vardır içinde

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) 

:

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') 

ve dönüşüm (isim) sadece bazı dönüşüm şeyler yapar. Bu nedenle, dosyanın izinleri 'genel okuma' dışında neredeyse tüm yollarla çalışır. Tüm AWS kimlik bilgileri ve kabul ettiğim kova adı, S3'ten dosya alıp gönderebildiğinden, ortamdan düzgün şekilde içe aktarılıyor.

büyük kafa karıştırıcı bölüm I başlamak için benim EC2 sunucuda venv veya üzerinde yüklenmiş sadece piton birinden bir piton ortamı açmak ve ben yukarıda göstermek tüm komutları çalıştırdığınızda, bu işi yapmasıdır . İzinsizce izni değiştirebilirim. Ve görev çalıştırıldığında, kereviz kütüklerinde herhangi bir hata atmaz, bu yüzden görevin aslında hatalara dönüştüğünü düşünmüyorum. Sadece değişmesi gereken şeyi değiştirmiyor. Ben denedim

şeyler:

  1. Bunlardan hiçbiri ya çalışmış böyle k.set_contents_from_filename(file,policy='public-read') veya k.make_public() veya b.set_acl('public-read',out_name) ama izinleri işlevinin diğer sürümlerini kullanmaya çalıştı.
  2. Herkesin izinleri değiştirmesine izin verildiğini ve hala çalışmadığını belirtmek için kepçedeki izinleri değiştirdim.
  3. Aşağıda bu konu için kepçe politikasını değiştirmeye çalıştı, fakat bir etkisi yaptı: Ben tüm bu yapmak gibi görünüyor, çünkü, gerçekten kafam karıştı

    { "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/*" ] } ] }

Sonunda Aynı EC2 örneğindeki bir python ortamından sadece iyi, ancak bu örnek üzerinde çalışan kod değil. Arama yaptım ve aradım ve işe yarayan önerileri bulamadım. Başka bir olası yararlı bilgi parçası (ama bu probleme bağlı olarak alakasız olabilir), yukarıdaki benzer komutları yaparak benim görüşüme S3'e bağlanmayı denediğimde bir hata döndürdüğümdür:

"Hiçbir işlemci kimlik doğrulamaya hazır değildi 1 işleyici kontrol edildi.['HmacAuthV1Handler'] Bu komutlar benim görevimde çalıştırıldığında çalışmasına rağmen (

kimlik bilgilerinizi kontrol edin (yanlış erişim anahtarı veya gizli erişim anahtarı veya bunun bir şey olduğunu varsayardım, ancak her şeyle çalışır). Sanırım ihtiyacım olan boto kütüphanesinin parçalarının python kodunda doğru ithalatı yapıyorum.

Bu örneği yeni takdim ettim, muhtemelen boto, kereviz, django vb. üzerinde. muhtemelen bir şey unuttum. gerçekten ne olup bittiğini emin değilim. Eğer soruyu cevaplamak için fazla bilgiye ihtiyacınız varsa lütfen bize bildirin.

peşin bir ton.

+0

Orada çok sayıda soru 8 ^) Özellikle, ACL'yi anahtarınıza ayarlamak için şunu deneyin: k.set_contents_from_filename (dosya, ilke = 'public-read'). Bu, ACL'yi ayrı bir işlem yerine dosya yazdığınız sırada ayarlamanıza olanak tanır. – garnaat

+0

Merhaba Garnaat, Öneriniz için teşekkürler. "Denediğim şeyler" bölümünde, "herkese açık okuma" anahtarını ayarlamak için tüm değişkenleri yapmaya çalıştığımı belirttim. Önerdiğin, denediğim şey. Kesinlikle iyi bir öneri ama yine de çalışmıyor. Beni gerçekten şaşırtan şey, herhangi bir varyasyonun bir python ortamından çalışmasıdır. Ve hiçbirisi task.py'deki koddan işe yaramaz. Önerin için teşekkürler! – barragan

cevap

7

Soruyu yaklaşık 4 gün sonra kendim çözdüm ve cevap bütün zaman burnumun altındaydı. Bu yüzden bunun karşısında olabilecek başka herkes için, sersemliğimi açığa çıkaracağım.

Kereviz için çok yeni. Fark etmediğim şey, kereviz görevlerinizde her değişiklik yaptığınızda, çalışanlarınızın değişiklikleri görmeleri için yeniden başlatılmaları gerektiğidir. Bu benim için her zaman bir problem olmadı çünkü gelişmekte olduğum her seferinde işçilere kendim başlamıştım, ama son zamanlarda bir kereviz olarak kereviz yapmaya başladım. Yani bu, kerevizlerin tüm zaman boyunca sürdüğü ilk değişiklikti.

Cevabım, sadece cismi yeniden başlatmam gerekti, böylece komutlarımı görecekti. Her şey şimdi çalışıyor. Ben gittim ve kereviz belgelerinde bir satır aramaya çalıştım ya da değişiklikler yaptığınızda veya kodun ithal edildiğini ancak açık bir şey görmediğini hatırlamanızla ilgili rehberler almaya başladım. Ben başka cevapların tamamını buldum: gelişimi için yararlı olabilir

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

. Ancak, yeni insanlara işçilere yeniden başlamanın gerekliliğinin farkında olduklarından emin olmak için kereviz veren açık bir çizgi görmedim. Belki bu açıktır ve ben sadece yeni. Bu konuda bir bilginin nerede olduğunu bilen herhangi biri varsa, birilerinin gelecekte okumak isteyebileceği bir hoşgeldin yazısı olacaktır. Herkesin zamanını boşa harcadığım için üzgünüm.