368 votos

¿Cómo puedo obtener el tamaño de un cubo de Amazon S3?

Me gustaría graficar el tamaño (en bytes, y # de ítems) de un bucket de Amazon S3 y estoy buscando una forma eficiente de obtener los datos.

El s3cmd proporcionan una forma de obtener el tamaño total del archivo utilizando s3cmd du s3://bucket_name pero me preocupa su capacidad de escalar ya que parece que obtiene datos sobre cada archivo y calcula su propia suma. Dado que Amazon cobra a los usuarios en GB-Mes, parece extraño que no expongan este valor directamente.

Aunque API REST de Amazon devuelve el número de elementos de un cubo, s3cmd no parece exponerlo. Podría hacer s3cmd ls -r s3://bucket_name | wc -l pero eso parece un truco.

El Rubí AWS::S3 parecía prometedor, pero sólo proporciona el número de elementos del cubo, no el tamaño total del cubo.

¿Alguien conoce otras herramientas de línea de comandos o bibliotecas (preferiblemente Perl, PHP, Python o Ruby) que proporcionen formas de obtener estos datos?

0 votos

He escrito una herramienta para analizar el tamaño del cubo: github.com/EverythingMe/ncdu-s3

27 votos

Me sorprende que Amazon cobre por el espacio, pero no proporcione el tamaño total que ocupa un cubo S3 simplemente a través del panel S3.

0 votos

Para mí la mayoría de las respuestas a continuación tomó bastante tiempo para recuperar el tamaño del cubo, sin embargo este Python script fue mucho más rápido que la mayoría de las respuestas - slsmk.com/obtener-el-tamaño-de-un-cubo-s3-usando-boto3-para-aws

455voto

rob Puntos 1459

Ahora se puede hacer de forma trivial con sólo el cliente de línea de comandos oficial de AWS:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/

Documentación oficial: Referencia de comandos de la CLI de AWS (versión 2)

Esto también acepta prefijos de ruta si no quieres contar todo el cubo:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory

29 votos

Esta es la mejor y más actualizada respuesta

4 votos

Estoy de acuerdo, esta es la mejor respuesta.

42 votos

Esto es muy lento para cubos con muchos archivos, ya que básicamente enumera todos los objetos en el cubo antes de mostrar el resumen, y en eso no es significativamente más rápido que la respuesta de @Christopher Hackett - excepto que esta es mucho más ruidosa.

207voto

Christopher Hackett Puntos 266

La CLI de AWS ahora admite el --query que toma un parámetro JMESPath expresiones.

Esto significa que se pueden sumar los valores de tamaño dados por list-objects utilizando sum(Contents[].Size) y contar como length(Contents[]) .

Esto se puede ejecutar utilizando la CLI oficial de AWS como se indica a continuación y se introdujo en Feb 2014

 aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"

33 votos

Para cubos grandes (#archivos grandes), esto es insoportablemente lento. La utilidad de Python s4cmd "du" es rapidísima: s4cmd du s3://bucket-name

0 votos

Eso es extraño. ¿Cuál es el perfil general de su cubo (poco profundo y gordo / profundo y fino)? Parece que s3cmd debería tener los mismos gastos generales que AWS CLI . En el el código muestra s3cmd hacer una solicitud para cada directorio en un cubo.

30 votos

para obtenerlo en formato legible para el ser humano: aws s3api --profile PROFILE_NAME list-objects --bucket BUCKET_NAME --output json --query "[sum(Contents[].Size), length(Contents[])]" | awk 'NR!=2 {print $0;next} NR==2 {print $0/1024/1024/1024" GB"}'

171voto

Toukakoukan Puntos 116

Consola AWS:

A partir de 28 de julio de 2015 puede obtener esta información vía CloudWatch . Si desea una interfaz gráfica de usuario, diríjase al Consola de CloudWatch : (Elija la región > ) Métricas > S3

Comando CLI de AWS:

Esto es mucho más rápido que algunos de los otros comandos publicados aquí, ya que no consulta el tamaño de cada archivo individualmente para calcular la suma.

 aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time 2015-07-15T10:00:00 --end-time 2015-07-31T01:00:00 --period 86400 --statistics Average --region eu-west-1 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=toukakoukan.com Name=StorageType,Value=StandardStorage

Importante : Debe especificar tanto StorageType como BucketName en el argumento de las dimensiones, de lo contrario no obtendrá resultados. Todo lo que tiene que cambiar es el argumento --start-date , --end-time y Value=toukakoukan.com .


Aquí hay un bash script que puedes usar para evitar tener que especificar --start-date y --end-time manualmente.

#!/bin/bash
bucket=$1
region=$2
now=$(date +%s)
aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time "$(echo "$now - 86400" | bc)" --end-time "$now" --period 86400 --statistics Average --region $region --metric-name BucketSizeBytes --dimensions Name=BucketName,Value="$bucket" Name=StorageType,Value=StandardStorage

27 votos

O en la consola de CloudWatch : (Elija la región > ) Métricas > S3

4 votos

Esta es, con mucho, la solución más fácil y rápida. Desgraciadamente, la respuesta sigue estando en el cuarto lugar.

0 votos

Esto funcionó para mi cubo con más de 10 millones de objetos. Pero el bash script no devolvía nada, tenía que ir a la GUI).

110voto

s3cmd puede hacer esto :

s3cmd du s3://bucket-name

0 votos

Gracias. Aquí hay un poco de tiempo. En un cubo que contiene un sistema de archivos deduplicados s3ql con alrededor de un millón de archivos que utilizan alrededor de 33 GB de datos sin duplicar, y alrededor de 93000 objetos s3, s3cmd du tomó alrededor de 4 minutos para calcular la respuesta. Tengo curiosidad por saber cómo se compara eso con otros enfoques como el de php descrito en otra parte aquí.

1 votos

Es lento porque el Llamada a la API S3 ListObjects devuelve objetos en páginas de 1000 objetos. Como la E/S es, con mucho, el factor limitante, creo que cualquier solución será relativamente lenta por encima de los 93000 objetos.

12 votos

s4cmd también puede hacer lo mismo, con la ventaja añadida de que las peticiones a la API de S3 son multihilo para calcular el resultado más rápidamente. La herramienta no se ha actualizado recientemente, pero el transeúnte de Internet puede encontrarla útil.

25voto

Si descarga un informe de uso se pueden representar gráficamente los valores diarios de la TimedStorage-ByteHrs campo.

Si quieres ese número en GiB, sólo tienes que dividir por 1024 * 1024 * 1024 * 24 (eso es GiB-horas para un ciclo de 24 horas). Si quieres el número en bytes, sólo tienes que dividirlo por 24 y hacer un gráfico.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: