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:
- Bunlardan hiçbiri ya çalışmış böyle
k.set_contents_from_filename(file,policy='public-read')
veyak.make_public()
veyab.set_acl('public-read',out_name)
ama izinleri işlevinin diğer sürümlerini kullanmaya çalıştı. - Herkesin izinleri değiştirmesine izin verildiğini ve hala çalışmadığını belirtmek için kepçedeki izinleri değiştirdim.
- 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.
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
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