¿Cómo puedo verificar mediante progtwigción los permisos de Amazon S3 con boto?

Tenemos un árbol espeso en un cubo en Amazon S3 con una gran cantidad de archivos. Acabo de descubrir que mientras algunos archivos tienen dos entradas de permisos, como se ve si uno hace clic en un archivo en la Consola de administración de AWS, las propiedades -> permisos, una línea es “todos” y el otro algún usuario específico, otros archivos solo tienen uno Entrada para ese usuario. Como resultado, tenemos problemas para descargar esos archivos en instancias de Amazon EC2 utilizando boto o curl.

Lo que necesito hacer es revisar todos los archivos en el cubo e inspeccionarlos. Sé cómo obtener la lista completa de claves para un prefijo. ¿Puedo usar boto para extraer permisos para una clave, y hay una manera estándar de probar si esos permisos son para cada persona o persona específica, y cuáles son?

Además, una vez que determine si una clave tiene permisos restrictivos, ¿puedo cambiarlos mediante progtwigción agregando permisos de lectura a “todos”?

Gracias

Aquí hay un código Python, usando boto, que vería todas las claves en un cubo. Si la clave no permite que “todos” lean el contenido de la clave, agregará permisos de public-read a esa clave:

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

Este código no se ha probado a fondo, por lo que debe probar primero. Además, tenga en cuenta que el resultado neto de esto es hacer que TODOS los objetos en el cubo sean legibles. Además, tenga en cuenta que esta secuencia de comandos está obteniendo la ACL actual de cada objeto en el depósito, por lo que si hay millones de objetos, hay millones de solicitudes que pueden llevar mucho tiempo y tienen un costo asociado.

Otro enfoque sería simplemente llamar a make_public() en cada clave del depósito, independientemente de su ACL actual.