¿Cómo puedo saber cuántos objetos he almacenado en un cubo S3?


154

A menos que me falte algo, parece que ninguna de las API que he visto le dirá cuántos objetos hay en un bucket / carpeta S3 (prefijo). ¿Hay alguna forma de contar?


Esta pregunta puede ser útil: stackoverflow.com/questions/701545/…
Brendan Long

1
La solución existe ahora en 2015: stackoverflow.com/a/32908591/578989
Mayank Jaiswal

Vea mi respuesta a continuación: stackoverflow.com/a/39111698/996926
advncd

Respuestas:


39

No hay manera, a menos que usted

  1. enumerarlos todos en lotes de 1000 (que pueden ser lentos y absorber el ancho de banda; parece que Amazon nunca comprime las respuestas XML), o

  2. inicie sesión en su cuenta en S3 y vaya a Cuenta - Uso. ¡Parece que el departamento de facturación sabe exactamente cuántos objetos ha almacenado!

Simplemente descargar la lista de todos sus objetos llevará algún tiempo y costará algo de dinero si tiene 50 millones de objetos almacenados.

Consulte también este hilo sobre StorageObjectCount , que se encuentra en los datos de uso.

Una API S3 para obtener al menos lo básico, incluso si tenía horas de antigüedad, sería genial.


Ese enlace está muerto, por cierto.
campos


Si eres flojo como yo, Newvem básicamente hace esto en tu nombre y agrega / rastrea los resultados en un nivel por cubo en tu cuenta S3.
rcoup

2
¿Podría actualizar su respuesta para incluir la respuesta de @ MayankJaiswal?
Joseph Casey

1
¡el departamento de facturación lo sabe todo! no es de extrañar que tengan el poder de derribar s3 costa este por accidente
ski_squaw

256

Usando AWS CLI

aws s3 ls s3://mybucket/ --recursive | wc -l 

o

aws cloudwatch get-metric-statistics \
  --namespace AWS/S3 --metric-name NumberOfObjects \
  --dimensions Name=BucketName,Value=BUCKETNAME \
              Name=StorageType,Value=AllStorageTypes \
  --start-time 2016-11-05T00:00 --end-time 2016-11-05T00:10 \
  --period 60 --statistic Average

Nota: El comando anterior de cloudwatch parece funcionar para algunos mientras que no para otros. Discutido aquí: https://forums.aws.amazon.com/thread.jspa?threadID=217050

Uso de la consola web de AWS

Puede mirar la sección métrica de cloudwatch para obtener aproximadamente la cantidad de objetos almacenados. ingrese la descripción de la imagen aquí

Tengo aproximadamente 50 millones de productos y me llevó más de una hora contarlos usando aws s3 ls


18
Esto debería estar más cerca de la cima.
Joseph Casey

3
@JosephMCasey Estoy de acuerdo. Esto también funciona para dar el número de objetos en un directorio con un cubo como este:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
Tim Peterson

1
Da este error cuando ejecuté lo anterior en cmd prompt: 'wc' no se reconoce como un comando interno o externo, un programa operable o un archivo por lotes. - Soy bastante nuevo en esto, ¿alguien puede dar una solución?
Sandun

Una advertencia de que CloudWatch no parece muy confiable. Tengo un archivo mp4 en un cubo que CloudWatch (NumberOfObjects metric) cuenta como 2,300 objetos separados. Obtuve el número correcto con AWS CLI.
AlexK

¿Por qué "promedio"? ¿Alguien no querría "Sum" en su lugar?
ffxsam

150

Hay un --summarizeinterruptor que incluye información de resumen del depósito (es decir, número de objetos, tamaño total).

Aquí está la respuesta correcta usando AWS cli:

aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"

Total Objects: 194273

Ver la documentación


44
Esto es genial: Total Objects: 7235 Total Size: 475566411749muy fácil.
bonh

16
Todavía tiene la mayor sobrecarga de enumerar los miles de objetos, desafortunadamente (actualmente en 600,000 más, por lo que esto lleva bastante tiempo)
MichaelChirico

¿Cuánto costará ejecutar esta tarea en un cubo con objetos de 5M?
Psicozoico el

2
Esta respuesta es extremadamente ineficiente, potencialmente muy lenta y costosa. Se itera sobre todo el cubo para encontrar la respuesta.
tejedor

2
Y debo agregar que iterar más de 1.200 millones de objetos almacenados en almacenamiento estándar puede costar alrededor de $ 6000 dólares.
C Johnson

66

Aunque esta es una pregunta antigua, y los comentarios se proporcionaron en 2015, ahora es mucho más simple, ya que S3 Web Console ha habilitado la opción "Obtener tamaño":

ingrese la descripción de la imagen aquí

Que proporciona lo siguiente:

ingrese la descripción de la imagen aquí


1
Sí, la nueva consola de AWS, aunque me duele los ojos, hace que el número de objetos calculados y el tamaño total estén disponibles con solo hacer clic en un botón.
Ani

11
Parece que esto solo funciona en el nivel de carpeta. "Obtener tamaño" no está disponible en el nivel de cubeta
G-.

1
@GRAMO-. ¿Qué sucede si selecciona todas las carpetas del depósito?
gvasquez

44
@GRAMO-. Sin embargo, el cuadro "seleccionar todo" solo selecciona las carpetas y los objetos que se muestran en la página, no todas las carpetas / objetos del depósito.
gparis 01 de

2
@gparis buen punto. Vale la pena señalar. Gracias. Entonces parece que en la consola, no tenemos una opción si hay más archivos o carpetas de las que se pueden mostrar en una sola página
G-.

50

Si utiliza la herramienta de línea de comandos s3cmd , puede obtener una lista recursiva de un depósito en particular y enviarlo a un archivo de texto.

s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt

Luego, en Linux, puede ejecutar un wc -l en el archivo para contar las líneas (1 línea por objeto).

wc -l listing.txt

El -rcomando en es para --recursive, por lo que también debería funcionar para subcarpetas.
Deepak Joy

3 notas sobre esto. a.) debería usar en aws s3 lslugar de s3cmd porque es más rápido. b.) Para cubos grandes puede llevar mucho tiempo. Tomó alrededor de 5 minutos para archivos 1mil. c.) Vea mi respuesta a continuación sobre el uso de Cloudwatch.
mastaBlasta

46

Ahora hay una solución fácil con la API S3 (disponible en el cli de AWS):

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

o para una carpeta específica:

aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"

1
Raphael, tu consulta de carpeta funciona muy bien, excepto cuando la carpeta está vacía o no existe, entonces obtienes: En la longitud de la función (), tipo no válido para el valor: Ninguno, esperado uno de: ['cadena', 'matriz' , 'objeto'], recibido: "nulo" ¿Hay alguna manera de hacer que salga 0 si la carpeta está vacía o no sale?
user3591836

1
Obtengo Illegal token value '(Contents[])]' (versión 1.2.9 de aws-cli), cuando solo uso --bucket my-buckety A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existcuando uso --bucket s3://my-bucket. (Definitivamente existe, y tiene más de 1000 archivos).
Darren Cook

@DarrenCook elimina s3: // del nombre del depósito. El cliente no parece soportar el protocolo.
Sriranjan Manjunath

Esto es mucho más rápido que los ejemplos wc -l. Con mis cubos contaría aproximadamente 3-4k objetos / seg. Entonces ~ 5 minutos por millón de objetos. "Obtener tamaño" en la GUI web de S3 probablemente usa algo similar bajo el capó, ya que toma aproximadamente el mismo tiempo.
notpeter

Para cubos MUY grandes, esta fue la única solución que funcionó para mí en un tiempo razonable desde (menos de 20 minutos)
Nick Sarafa

40

Puede usar las métricas de AWS Cloudwatch para s3 para ver el recuento exacto de cada depósito. métrica de cloudwatch cuando selecciona un depósito


Creo que esta es la mejor respuesta
Oktav

La única respuesta real, sin hacer algo ridículo como enumerar 1m + teclas. Olvidé que estaba allí.
Andrew Backer

Esto necesita más votos a favor. Todas las demás soluciones escalan mal en términos de costo y tiempo.
Aaron R.

5

Vaya a Facturación de AWS, luego informes, luego informes de uso de AWS. Seleccione Amazon Simple Storage Service, luego Operation StandardStorage. Luego puede descargar un archivo CSV que incluye un UsageType de StorageObjectCount que enumera el recuento de elementos para cada depósito.


4

Puede obtener fácilmente el recuento total y el historial si va a la pestaña "Administración" de la consola s3 y luego hace clic en "Métricas" ... Captura de pantalla de la pestaña


¿podría actualizar la imagen para mostrar el NumberOfObjects (count/day)gráfico? Sería mejor ya que está directamente relacionado con la pregunta. En su captura de pantalla, está mostrando lo BucketSizeBytes (bytes/day)que, si bien es útil, no está directamente relacionado con el problema.
guzmonne

1
A partir de 2019, esta debería ser la respuesta aceptada. Todo lo demás está desactualizado o es lento.
C Johnson

2

La API devolverá la lista en incrementos de 1000. Verifique la propiedad IsTruncated para ver si aún hay más. Si es así, debe realizar otra llamada y pasar la última clave que obtuvo como propiedad de marcador en la próxima llamada. Luego continuaría haciendo un bucle como este hasta que IsTruncated sea falso.

Consulte este documento de Amazon para obtener más información: iterando a través de resultados de varias páginas


2

Hilo antiguo, pero aún relevante ya que estaba buscando la respuesta hasta que lo descubrí. Quería un recuento de archivos usando una herramienta basada en GUI (es decir, sin código). Ya uso una herramienta llamada 3Hub para las transferencias de arrastrar y soltar hacia y desde S3. Quería saber cuántos archivos tenía en un depósito en particular (no creo que la facturación lo desglose en depósitos).

So, using 3Hub, 
- list the contents of the bucket (looks basically like a finder or explorer window)
- go to the bottom of the list, click 'show all'
- select all (ctrl+a)
- choose copy URLs from right-click menu
- paste the list into a text file (I use TextWrangler for Mac) 
- look at the line count  

Tenía 20521 archivos en el cubo e hice el recuento de archivos en menos de un minuto.


2

Usé el script de python de scalablelogic.com (agregando el registro de conteo). Funcionó muy bien.

#!/usr/local/bin/python

import sys

from boto.s3.connection import S3Connection

s3bucket = S3Connection().get_bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.list():
    totalCount += 1
    size += key.size

print 'total size:'
print "%.3f GB" % (size*1.0/1024/1024/1024)
print 'total count:'
print totalCount

Para que lo sepas, esto no funciona con boto3. Contribuí con una sugerencia a continuación como una respuesta diferente.
fuzzygroup

2

En s3cmd, simplemente ejecute el siguiente comando (en un sistema Ubuntu):

s3cmd ls -r s3://mybucket | wc -l

13
¿Por qué resucitó una pregunta de 5 años para publicar una copia mal formateada de una respuesta existente ?
Alquimista de dos bits

La respuesta anterior canalizó la salida en un archivo txt innecesariamente.
mjsa

10
OMI, este debería ser un comentario sobre esa respuesta, entonces. Esta es una diferencia realmente trivial.
Alquimista de dos bits

2
Parece una respuesta digna, especialmente porque la respuesta seleccionada para esta pregunta comienza con 'No hay forma ...' y @mjsa ha proporcionado una respuesta de una línea.
Nan

Esta no es una buena respuesta porque no tiene en cuenta los objetos versionados.
3h4x

2

Si está utilizando AWS CLI en Windows, puede usar Measure-ObjectPowerShell para obtener el recuento total de archivos, al igual que wc -len * nix.

PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object

Count    : 25
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

Espero eso ayude.


2

Una de las formas más simples de contar el número de objetos en s3 es:

Paso 1: Seleccione la carpeta raíz Paso 2: Haga clic en Acciones -> Eliminar (Obviamente, tenga cuidado de no eliminarlo) Paso 3: Espere unos minutos, aws le mostrará la cantidad de objetos y su tamaño total.

Vota si encuentras la solución.


1

Ninguna de las API le dará un recuento porque realmente no hay ninguna API específica de Amazon para hacer eso. Solo tiene que ejecutar una lista de contenidos y contar el número de resultados que se devuelven.


Por alguna razón, las bibliotecas de rubí (right_aws / appoxy_aws) no enumerarán más que los primeros 1000 objetos en un cubo. ¿Hay otros que enumerarán todos los objetos?
campos

Cuando solicita la lista, proporcionan un campo "NextToken", que puede usar para enviar la solicitud nuevamente con el token, y enumerará más.
Mitch Dempsey

1

Desde la línea de comandos en AWS CLI, use ls plus --summarize. Le dará la lista de todos sus artículos y el número total de documentos en un cubo en particular. No he intentado esto con cubos que contienen subgrupos:

aws s3 ls "s3://MyBucket" --summarize

Me tomó un poco de tiempo (me tomó listar mis documentos de 16 + K aproximadamente 4 minutos), pero es más rápido que contar 1K a la vez.



0

3Hub se suspende. Hay una mejor solución, puede usar Transmitir (solo Mac), luego simplemente conectarse a su bucket y elegir Show Item Countdel Viewmenú.


Lamentablemente, la transmisión solo muestra hasta 1000 elementos (y, por lo tanto, el recuento de elementos también está maximizado en 1000)
Tino

0

Puede descargar e instalar el navegador s3 desde http://s3browser.com/ . Cuando selecciona un depósito en la esquina central derecha, puede ver la cantidad de archivos en el depósito. Pero, el tamaño que muestra es incorrecto en la versión actual.

Gubs


0

La forma más fácil es usar la consola de desarrollador, por ejemplo, si está en Chrome, elija Herramientas de desarrollador, y puede ver lo siguiente, puede buscar y contar o hacer alguna coincidencia, como 280-279 + 1 = 2

...


¿Podría agregar más detalles sobre cómo ha utilizado las herramientas de desarrollador para calcular el número total de objetos en un depósito?
Jugal Panchal

0

Potencialmente, puede usar el inventario de Amazon S3 que le dará una lista de objetos en un archivo csv




0

Puede ejecutar este comando cli para obtener el recuento total de archivos en el depósito o en una carpeta específica

Escanear todo el cubo

aws s3api list-objects-v2 --bucket testbucket | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME | grep "Key" | wc -l

puedes usar este comando para obtener detalles

aws s3api list-objects-v2 --bucket BUCKET_NAME

Escanear una carpeta específica

aws s3api list-objects-v2 --bucket testbucket --prefix testfolder --start-after testfolder/ | grep "Key" | wc -l

aws s3api list-objects-v2 --bucket BUCKET_NAME --prefix FOLDER_NAME --start-after FOLDER_NAME/ | grep "Key" | wc -l

0

Si está buscando archivos específicos, digamos .jpgimágenes, puede hacer lo siguiente:

aws s3 ls s3://your_bucket | grep jpg | wc -l

0

A continuación se muestra cómo puede hacerlo utilizando el cliente java.

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.519</version>
</dependency>
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectListing;

public class AmazonS3Service {

    private static final String S3_ACCESS_KEY_ID = "ACCESS_KEY";
    private static final String S3_SECRET_KEY = "SECRET_KEY";
    private static final String S3_ENDPOINT = "S3_URL";

    private AmazonS3 amazonS3;

    public AmazonS3Service() {
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setProtocol(Protocol.HTTPS);
        clientConfiguration.setSignerOverride("S3SignerType");
        BasicAWSCredentials credentials = new BasicAWSCredentials(S3_ACCESS_KEY_ID, S3_SECRET_KEY);
        AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
        AmazonS3ClientBuilder.EndpointConfiguration endpointConfiguration = new AmazonS3ClientBuilder.EndpointConfiguration(S3_ENDPOINT, null);
        amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(credentialsProvider).withClientConfiguration(clientConfiguration)
                .withPathStyleAccessEnabled(true).withEndpointConfiguration(endpointConfiguration).build();
    }

    public int countObjects(String bucketName) {
        int count = 0;
        ObjectListing objectListing = amazonS3.listObjects(bucketName);
        int currentBatchCount = objectListing.getObjectSummaries().size();
        while (currentBatchCount != 0) {
            count += currentBatchCount;
            objectListing = amazonS3.listNextBatchOfObjects(objectListing);
            currentBatchCount = objectListing.getObjectSummaries().size();
        }
        return count;
    }
}

0

Aquí está la versión boto3 del script python incrustado anteriormente.

import sys
import boto3

s3 = boto3.resource('s3')
s3bucket = s3.Bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.objects.all():
    totalCount += 1
    size += key.size

print('total size:')
print("%.3f GB" % (size*1.0/1024/1024/1024))
print('total count:')
print(totalCount)`

0

aws s3 ls s3: // nombre-cubo / carpeta-prefijo-si-alguno - recursivo | wc -l


Funciona por más de 1000, contó 4258 para mí
KingAndrew

Las líneas no corresponden directamente al número de archivos. Porque también tienen una línea completa solo para la fecha y el directorio.
CMCDragonkai

El comando funciona para un número limitado de archivos. En mi caso, el recuento de archivos es más de un millón y nunca da ningún resultado. Pero es una buena opción para archivos limitados.
Jugal Panchal
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.