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:
- Próbowałem używać inne wersje funkcji uprawnień, takich jak
k.set_contents_from_filename(file,policy='public-read')
lubk.make_public()
lubb.set_acl('public-read',out_name)
ale żaden z nich pracował albo. - Zmieniłem uprawnienia do wiadra, aby powiedzieć, że wszyscy mogli zmieniać uprawnienia i nie działało.
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.
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
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