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


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

los s3cmd Las herramientas proporcionan una manera de obtener el tamaño total del archivo usando s3cmd du s3://bucket_name, pero me preocupa su capacidad para escalar, ya que parece que obtiene datos sobre cada archivo y calcula su propia suma. Como Amazon cobra a los usuarios en meses GB, parece extraño que no expongan este valor directamente.

A pesar de que API REST de Amazon devuelve el número de artículos en un cubo, s3cmd No parece exponerlo. Yo podría hacer s3cmd ls -r s3://bucket_name | wc -l Pero eso parece un hack.

El rubí AWS :: S3 la biblioteca parecía prometedora, pero solo proporciona el número de elementos de cubeta, no el tamaño total de cubeta.

¿Alguien sabe de otras herramientas o bibliotecas de línea de comandos (prefiera Perl, PHP, Python o Ruby) que brinden formas de obtener esta información?


248
2017-11-15 00:40


origen


Escribí una herramienta para analizar el tamaño del cubo: github.com/EverythingMe/ncdu-s3 - omribahumi
Me sorprende que Amazon cargue por el espacio, pero no proporcione el tamaño total que ocupa un cucharón S3 simplemente a través del panel S3. - Luke
Para mí, la mayoría de las respuestas a continuación tardaron bastante tiempo en recuperar el tamaño del depósito, sin embargo, este script de Python fue mucho más rápido que la mayoría de las respuestas: slsmk.com/getting-the-size-of-an-s3-bucket-using-boto3-for-aws - Vaulstein


Respuestas:


AWS CLI ahora es compatible con --query parámetro que toma un JMESPath expresiones

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

Esto se puede ejecutar utilizando el CLI oficial de AWS como se muestra a continuación y se introdujo en Febrero de 2014

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

146
2017-11-16 23:00



Para cubos grandes (#archivos grandes), esto es insoportablemente lento. La utilidad Python s4cmd "du" es muy rápida: s4cmd du s3://bucket-name - Brent Faust
Eso es extraño. ¿Cuál es el perfil general de su cubo (poco profundo y grueso / profundo y delgado)? Parece que s3cmd debe tener los mismos gastos generales que AWS CLI. En el código que muestra  s3cmd Hacer una solicitud para cada directorio en un cubo. - Christopher Hackett
para obtenerlo en formato legible para humanos: 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"}' - Sandeep
Ahora que AWS Cloudwatch ofrece una métrica por cubeta de "BucketSizeBytes", esta ya no es la solución correcta. Vea la respuesta de Toukakoukan a continuación. - cce
s4cmd du Es maravilloso, gracias @Brent Faust! pequeña nota (para los interesados) que necesita agregar -r para obtener los tamaños de los subdirectorios también. - Greg Sadetsky


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

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

Documentacion oficial

Esto también acepta prefijos de ruta si no quiere contar todo el grupo:

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

254
2017-09-09 14:04



Esta es la mejor y actualizada respuesta. - Tim
De acuerdo, esta es la mejor respuesta. - Luis Artola
Esto es muy lento para los grupos con muchos archivos, ya que básicamente enumera todos los objetos en el grupo antes de mostrar el resumen, y en que no es significativamente más rápido que la respuesta de @Christopher Hackett, excepto que esta es mucho más ruidosa. - Guss
Ejecutar en una instancia de EC2 con la misma región del compartimiento para mejorar la latencia - juanmirocks
Si solo está interesado en el tamaño del resumen, esta es la solución más rápida y actualizada, y puede simplemente ir a través de la cola para encontrar ese valor. - Charlie Hileman


Consola AWS:

A partir de 28 de julio de 2015 puedes obtener esta informacion a través de CloudWatch. Si quieres una GUI, ve a la Consola CloudWatch: (Seleccione Región>) Métricas> S3

Comando de AWS CLI:

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 necesitas cambiar es el --start-date, --end-timey Value=toukakoukan.com.


Aquí hay un script de bash que puede usar para evitar tener que especificar --start-date y --end-time a mano.

#!/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

104
2017-07-31 21:58



O en la consola de CloudWatch: (Seleccione Región>) Métricas> S3 - Halil Özgür
Esta es, con mucho, la solución más fácil y rápida. Desafortunadamente, la respuesta todavía está en el cuarto lugar. - luk2302
Esto funcionó para mi cubo con 10 millones + objetos. Pero el script de bash no devolvió nada, tenía que ir a la GUI). - Petah
También debe tenerse en cuenta que también tendrá que cambiar la región. - majikman
Mayo 2018: los errores de script con Invalid value ('1525354418') for param timestamp:StartTime of type timestamp - anneb


s3cmd puede hacer esto:

s3cmd du s3://bucket-name


103
2017-07-08 13:40



Gracias. Aquí hay algunos tiempos. En un cubo que contiene un sistema de archivos deduplicado con s3ql con aproximadamente un millón de archivos que usan aproximadamente 33 GB de datos no ocupados y aproximadamente 93000 objetos s3, s3cmd du tardó aproximadamente 4 minutos en calcular la respuesta. Tengo curiosidad por saber cómo se compara con otros enfoques como el de php descrito en otra parte aquí. - nealmcb
Es lento porque el Llamada a la API de 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 con respecto a los 93000 objetos. - David Snabel-Caunt
s4cmd También puede hacer lo mismo, con el beneficio adicional de subprocesos múltiples de las solicitudes a la API de S3 para calcular el resultado más rápido. La herramienta no se ha actualizado recientemente, pero el transeúnte de Internet puede encontrarla útil. - Nick Chammas
s4cmd solo devuelve 0 para mí, y devuelve BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format. Para cubos con caracteres en mayúscula. - Lakitu


Si descarga un informe de uso, puedes graficar los valores diarios para el TimedStorage-ByteHrs campo.

Si quieres ese número en GiB, solo divide por 1024 * 1024 * 1024 * 24 (eso es GiB-horas para un ciclo de 24 horas). Si desea el número en bytes, simplemente divida por 24 y grafique.


22
2017-12-05 17:22





Usando las herramientas oficiales de línea de comandos de AWS s3:

aws s3 ls s3://bucket/folder --recursive | awk 'BEGIN {total=0}{total+=$3}END{print total/1024/1024" MB"}'

16
2018-04-23 11:22



Proporcione el enlace donde Amazon en realidad dice esto, por favor. No puedo encontrarlo - lobi
docs.aws.amazon.com/cli/latest/index.html - dyltini
docs.aws.amazon.com/cli/latest/reference/s3/ls.html es un mejor enlace - Ian Bamforth
Esta respuesta funcionó mejor y más rápido para mí. - Miro
¡La mejor y más rápida respuesta! - PlagTag


s4cmd es la forma más rápida que he encontrado (una utilidad de línea de comandos escrita en Python):

pip install s4cmd

Ahora para calcular todo el tamaño del cazo utilizando varios hilos:

s4cmd du -r s3://bucket-name

10
2018-03-31 22:12



No, s4cmd du s3://123123drink Simplemente no devolverá el tamaño del cubo. Para obtener el tamaño del cubo, agregue el recursivo. -r, así: s4cmd du -r s3: // 123123drink - George Chalhoub
Sí, buen punto @BukLau (añadido -r al ejemplo anterior para evitar confusiones cuando las personas usan carpetas simuladas en S3). - Brent Faust