Estoy usando el módulo boto3 en python para interactuar con S3 y actualmente puedo obtener el tamaño de cada clave individual en un depósito S3. Pero mi motivo es encontrar el espacio de almacenamiento de solo las carpetas de nivel superior (cada carpeta es un proyecto diferente) y debemos cobrar por proyecto por el espacio utilizado. Puedo obtener los nombres de las carpetas de nivel superior, pero no obtengo ningún detalle sobre el tamaño de las carpetas en la siguiente implementación. La siguiente es mi implementación para obtener los nombres de las carpetas de nivel superior.
import boto import boto.s3.connection AWS_ACCESS_KEY_ID = "access_id" AWS_SECRET_ACCESS_KEY = "secret_access_key" Bucketname = 'Bucket-name' conn = boto.s3.connect_to_region('ap-south-1', aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, is_secure=True, # uncomment if you are not using ssl calling_format = boto.s3.connection.OrdinaryCallingFormat(), ) bucket = conn.get_bucket('bucket') folders = bucket.list("", "/") for folder in folders: print(folder.name)El tipo de carpeta aquí es boto.s3.prefix.Prefix y no muestra ningún detalle de tamaño. ¿Hay alguna forma de buscar una carpeta/objeto en un depósito S3 por su nombre y luego obtener el tamaño de ese objeto?
Para obtener el tamaño de una carpeta S3, los objetos (accesibles en boto3.resource('s3').Bucket) proporcionan el filter(Prefix) que le permite recuperar SOLO los archivos que respetan la condición Prefijo, y hace está bastante optimizado.
import boto3 def get_size(bucket, path): s3 = boto3.resource('s3') my_bucket = s3.Bucket(bucket) total_size = 0 for obj in my_bucket.objects.filter(Prefix=path): total_size = total_size + obj.size return total_size Entonces, digamos que desea obtener el tamaño de la carpeta s3://my-bucket/my/path/ , luego llamaría a la función anterior así:
get_size("my-bucket", "my/path/")Entonces esto, por supuesto, también es fácilmente aplicable a las carpetas de nivel superior
Para encontrar el tamaño de las "carpetas" de nivel superior en S3 (S3 realmente no tiene un concepto de carpetas, pero muestra una estructura de carpetas en la interfaz de usuario), algo como esto funcionará:
from boto3 import client conn = client('s3') top_level_folders = dict() for key in conn.list_objects(Bucket='kitsune-buildtest-production')['Contents']: folder = key['Key'].split('/')[0] print("Key %s in folder %s. %d bytes" % (key['Key'], folder, key['Size'])) if folder in top_level_folders: top_level_folders[folder] += key['Size'] else: top_level_folders[folder] = key['Size'] for folder, size in top_level_folders.items(): print("Folder: %s, size: %d" % (folder, size))No uso boto3, solo aws cli, pero esta breve línea sirve para el propósito. Por lo general, pongo una cola -1 para obtener solo el tamaño de la carpeta de resumen. Sin embargo, puede ser un poco lento para carpetas que tienen muchos objetos.
aws s3 ls --summarize --human-readable --recursive s3://nombre-depósito/nombre-de-carpeta | cola -1