2013-09-30 14 views
5

Próbowałem znaleźć rozwiązanie tego problemu przez około 36 godzin, więc mam nadzieję, że nie powielam pytania ani nie pytam o coś oczywistego. Buduję aplikację internetową, która musi manipulować plikami, które przechowuję w S3 i przywrócić nowe wersje w S3 z acl "read-publicznie". Następnie inna strona umożliwia przeglądanie zaktualizowanego pliku. Aplikacja istnieje na serwerze Amazon EC2 i łączy się z Amazon S3 bucket.Nie można ustawić uprawnień do plików w S3 przy użyciu boto i django

Używam django, selera i boto, aby to zrobić. Mam konfigurację zadania selera, która pobiera pewne informacje z jednego z moich widoków i przetwarza, a następnie wysyła nowy plik do S3. Mogę pobrać oryginalny plik z S3, manipulować nim z powodzeniem i odesłać go do S3. Wydaje się, że jedyną rzeczą, która nie działa, jest zmiana uprawnień do tego pliku. Tak więc wszystko działa, z wyjątkiem, gdy idziesz do strony przeglądania, pojawia się błąd 403 (Zabroniony) podczas próby uzyskania dostępu do tego pliku.

Jeśli sam wejdę do S3 i zmienię uprawnienia do tego pliku, aby każdy mógł je przeczytać, wszystko działa. Zanim przejdę dalej, kod, który używam w moim zadaniu, że prawie działa to:

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) 

gdzie funkcjonuje tam są:

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

i conv (nazwa) po prostu robi kilka rzeczy konwersji. Tak więc działa to prawie przez cały czas, z tym że uprawnienia pliku nie są "czytane publicznie". Wszystkie poświadczenia AWS i nazwa zasobnika, które zakładam, są poprawnie importowane ze środowiska, ponieważ mogą przesyłać i pobierać pliki do i od S3.

Dużym mylącym aspektem jest to, że kiedy otwieram środowisko Pythona z venv na moim serwerze EC2 lub po prostu python, który został na nim zainstalowany, i uruchamiam wszystkie polecenia pokazane powyżej, to działa . Mogę zmienić pozwolenie bez żadnych problemów. A kiedy zadanie zostanie uruchomione, nie spowoduje żadnych błędów w dziennikach selera, więc nie sądzę, że zadanie jest faktycznie uruchamiane na błędy. Po prostu nie zmienia tego, co ma się zmienić.

Rzeczy, które próbowałem:

  1. Próbowałem używać inne wersje funkcji uprawnień, takich jak k.set_contents_from_filename(file,policy='public-read') lub k.make_public() lub b.set_acl('public-read',out_name) ale żaden z nich pracował albo.
  2. Zmieniłem uprawnienia do wiadra, aby powiedzieć, że wszyscy mogli zmieniać uprawnienia i nie działało.
  3. Próbowałem zmienić politykę wiadro do tego poniżej i to żadnego skutku:

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

w końcu, jestem naprawdę mylić, bo mogę wydawać się zrobić wszystko dobrze od środowiska Pythona na tej samej instancji EC2, ale nie kodu działającego na tej instancji. Szukałem i szukałem i nie mogłem znaleźć żadnych sugestii, które działały. Kolejną potencjalnie użyteczną informacją (ale może to być nieistotne w zależności od problemu) jest to, że jeśli spróbuję połączyć się z S3 w moim widoku, wykonując podobne polecenia powyżej, zwróci błąd:

"Żaden przewodnik nie był gotowy do uwierzytelnienia Sprawdzono 1 handlerów.['HmacAuthV1Handler'] Sprawdź swoje poświadczenia "

, mimo że działa, gdy te polecenia są uruchamiane w moim zadaniu (zakładam, że był to niewłaściwy klucz dostępu lub tajny klucz dostępu lub coś podobnego, ale działa ze wszystkim innym). Myślę, że robię poprawny import w kodzie Pythona części boto biblioteki, której potrzebuję

Niedawno ustawiłem tę instancję, więc prawdopodobnie ma ona prawie najnowszą wersję boto, selera, django itp. Prawdopodobnie zapomniałem o czymś.Proszę dać mi znać, jeśli potrzebujesz więcej informacji, aby odpowiedzieć na pytanie.Nie naprawdę nie jestem pewien co się dzieje

Z góry dziękuję z góry t.

+0

Wiele pytań w tym miejscu 8 ^) W celu ustawienia ACL na kluczu, spróbuj: k.set_contents_from_filename (file, policy = 'public-read'). Umożliwia to ustawienie listy ACL w czasie, gdy piszesz plik, a nie w oddzielnej operacji. – garnaat

+0

Cześć Garnaat, dzięki za sugestię. W sekcji "Rzeczy, które wypróbowałem" wspomniałem, że próbowałem zrobić wszystkie warianty, aby ustawić klucz do "czytania publicznego". Ten, który zasugerowałeś, to ten, który próbowałem. To zdecydowanie dobra sugestia, ale nadal nie działa. Rzecz, która naprawdę mnie myli to to, że którykolwiek z wariantów działa ze środowiska python. I żaden nie działa z kodu w tasks.py. Dzieki za sugestie! – barragan

Odpowiedz

7

Sam rozwiązałem problem po około 4 dniach i odpowiedź była pod nosem przez cały czas. Więc ze względu na kogokolwiek innego, co może się zdarzyć w tej sytuacji, ujawnię swoją głupotę.

Jestem bardzo nowy w selerze. Nie zdawałem sobie sprawy, że za każdym razem, gdy zmieniasz swoje zadania związane z selerem, twoi pracownicy muszą zostać ponownie uruchomieni, aby zobaczyć zmiany. Nie stanowiło to dla mnie problemu, ponieważ zawsze tworzyłem pracowników za każdym razem, gdy się rozwijałem, ale ostatnio przerzuciłem się na prowadzenie selera jako demona. Tak więc to była pierwsza zmiana, którą dokonałem przez cały czas selera.

Odpowiedź była taka, że ​​wystarczy uruchomić ponownie demona, aby mógł zobaczyć moje polecenia. Wszystko działa teraz. Poszedłem i próbowałem znaleźć wiersz w dokumentacji selera lub rozpocząć przewodników o pamiętaniu, aby to zrobić, gdy wprowadzasz zmiany lub kod jest importowany, ale nie widzisz niczego oczywistego. Znalazłem to przez niektórych innych odpowiedzi:

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

które mogą być przydatne dla rozwoju. Ale nie widziałem żadnej wyraźnej linii informującej nowych ludzi do selera, aby upewnić się, że zdają sobie sprawę z konieczności ponownego uruchomienia pracowników. Być może jest to oczywiste i jestem po prostu zbyt nowy. Jeśli ktoś wie, gdzie znajduje się link do niektórych informacji na jego temat, będzie to mile widziany wpis, ponieważ ktoś może chcieć go przeczytać w przyszłości. Przepraszamy za zmarnowanie czasu dla wszystkich.