2013-04-17 14 views
7

Mamy krzaczaste drzewo w wiadrze na Amazon S3 z dużą liczbą plików. Właśnie odkryłem, że podczas gdy niektóre pliki mają dwa wpisy uprawnień, jak widać po kliknięciu pliku w konsoli zarządzania AWS, to właściwości -> uprawnienia, jedna linia to "wszyscy", a druga to niektórzy konkretni użytkownicy, inne pliki po prostu mają jeden wpis dla tego użytkownika. Jako wyniki mamy problemy z pobieraniem tych plików do instancji Amazon EC2 za pomocą boto lub curl.Jak mogę programowo sprawdzić uprawnienia Amazon S3 za pomocą boto?

Co muszę zrobić, to przejrzeć wszystkie pliki w wiadrze i obejrzeć je. Wiem, jak uzyskać pełną listę kluczy dla prefiksu. Czy mogę użyć boto do wyodrębnienia uprawnień dla klucza i czy istnieje standardowy sposób testowania, czy te uprawnienia są dla wszystkich lub dla konkretnej osoby i czym one są?

Ponadto, gdy ustalę, czy dany klucz ma restrykcyjne uprawnienia, czy mogę je programowo zmienić, dodając uprawnienia odczytu do "wszystkich"?

Thx

Odpowiedz

11

Oto niektóre kodu Pythona, używając boto, że byłoby przejrzeć wszystkie klawisze w wiadrze. Jeśli klucz nie pozwala „każdy” czytać zawartość klucza, doda public-read uprawnienia do tego klucza:

import boto 

all_users = 'http://acs.amazonaws.com/groups/global/AllUsers' 
conn = boto.connect_s3() 
bucket = conn.get_bucket('mybucket') 

for key in bucket: 
    readable = False 
    acl = key.get_acl() 
    for grant in acl.acl.grants: 
     if grant.permission == 'READ': 
      if grant.uri == all_users: 
       readable = True 
    if not readable: 
     key.make_public() 

Ten kod nie został gruntownie przetestowany, więc powinieneś spróbować rzeczy w pierwszej kolejności. Należy również jasno stwierdzić, że wynikiem tego jest sprawienie, aby WSZYSTKIE obiekty w wiadrze były czytelne dla każdego. Należy również pamiętać, że ten skrypt pobiera bieżącą listę ACL każdego obiektu w pakiecie, więc jeśli istnieją miliony obiektów, to jest to milion żądań, które mogą zająć dużo czasu i wiążą się z tym pewne koszty.

Innym podejściem byłoby po prostu zadzwonić pod numer make_public() na każdym kluczu w wiadrze, bez względu na bieżącą listę ACL.

+1

Mam wiele obiektów w moim wiadrze, więc chciałem uczynić ten proces wielowątkowym. Oto mój kod na wypadek, gdyby ktoś inny uznał to za przydatne: http://www.pixelchef.net/working-amazon-s3-using-boto-multithreaded-edition – northben

+0

Czy masz podobne rozwiązanie dla boto3? –

Powiązane problemy