Come posso sapere quanti oggetti ho archiviato in un bucket S3?


155

A meno che non mi manchi qualcosa, sembra che nessuna delle API che ho visto ti dirà quanti oggetti si trovano in un bucket / cartella S3 (prefisso). C'è un modo per ottenere un conteggio?


Questa domanda potrebbe essere utile: stackoverflow.com/questions/701545/…
Brendan Long,

1
La soluzione esiste ora nel 2015: stackoverflow.com/a/32908591/578989
Mayank Jaiswal

Vedere la mia risposta qui sotto: stackoverflow.com/a/39111698/996926
advncd

Risposte:


40

Non c'è modo, a meno che tu

  1. elencarli tutti in batch di 1000 (che può essere lento e risucchiare la larghezza di banda - Amazon sembra non comprimere mai le risposte XML), o

  2. accedi al tuo account su S3 e vai Account - Utilizzo. Sembra che il reparto fatturazione sappia esattamente quanti oggetti hai archiviato!

Il semplice download dell'elenco di tutti i tuoi oggetti richiederà del tempo e un po 'di denaro se hai 50 milioni di oggetti memorizzati.

Vedi anche questo thread su StorageObjectCount - che si trova nei dati di utilizzo.

Un'API S3 per ottenere almeno le basi, anche se aveva ore, sarebbe ottima.


A proposito, quel collegamento è morto.
campi


Se sei pigro come me, Newvem fondamentalmente lo fa per tuo conto e aggrega / tiene traccia dei risultati a livello di bucket sul tuo account S3.
rcoup

2
Potresti aggiornare la tua risposta per includere la risposta di @ MayankJaiswal?
Joseph Casey,

1
il reparto fatturazione sa tutto! non c'è da stupirsi che abbiano il potere di abbattere la s3 costa orientale per caso
ski_squaw

256

Utilizzo della CLI AWS

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: il comando cloudwatch sopra sembra funzionare per alcuni mentre non per altri. Discusso qui: https://forums.aws.amazon.com/thread.jspa?threadID=217050

Utilizzando la console Web AWS

Puoi guardare la sezione metrica di cloudwatch per ottenere circa il numero di oggetti memorizzati. inserisci qui la descrizione dell'immagine

Ho circa 50 milioni di prodotti e ci sono voluti più di un'ora per contare aws s3 ls


18
Questo dovrebbe essere più vicino all'inizio.
Joseph Casey,

3
@JosephMCasey Sono d'accordo. Questo funziona anche per fornire il numero di oggetti in una directory con un bucket come questo:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
tim peterson,

1
Fornisce questo errore quando ho eseguito quanto sopra nel prompt cmd: "wc" non viene riconosciuto come comando interno o esterno, programma eseguibile o file batch. - Sono abbastanza nuovo per questo, quindi qualcuno può dare una soluzione?
Sandun,

Un avvertimento che CloudWatch non sembra molto affidabile. Ho un file mp4 in un bucket che CloudWatch (metrica NumberOfObjects) conta come 2.300 oggetti separati. Ho ottenuto il numero corretto con AWS CLI.
AlexK

Perché "Media"? Qualcuno non vorrebbe invece "Somma"?
ffxsam,

150

C'è un --summarizeinterruttore che include le informazioni di riepilogo del bucket (cioè numero di oggetti, dimensione totale).

Ecco la risposta corretta utilizzando AWS cli:

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

Total Objects: 194273

Vedi la documentazione


4
Questo è fantastico: Total Objects: 7235 Total Size: 475566411749- così facile.
bonh,

16
Sfortunatamente ha ancora il principale sovraccarico di elencare le migliaia di oggetti, purtroppo (attualmente con oltre 600.000, quindi questo richiede molto tempo)
MichaelChirico

quanto costerà eseguire questa attività sul bucket con oggetti 5M?
Psicozoico,

2
Questa risposta è estremamente inefficiente, potenzialmente molto lenta e costosa. Esamina l'intero bucket per trovare la risposta.
tessitore

3
E potrei aggiungere, che iterando oltre 1,2 miliardi di oggetti archiviati in archivi standard, può costare circa $ 6000 dollari.
C Johnson,

66

Anche se questa è una vecchia domanda e il feedback è stato fornito nel 2015, in questo momento è molto più semplice, poiché S3 Web Console ha abilitato un'opzione "Ottieni dimensioni":

inserisci qui la descrizione dell'immagine

Che fornisce quanto segue:

inserisci qui la descrizione dell'immagine


1
Sì, la nuova Console AWS, sebbene mi faccia male agli occhi, rende disponibile il calcolo del numero di oggetti e delle dimensioni totali con un clic del pulsante.
Ani,

11
Questo sembra funzionare solo a livello di cartella. "Ottieni dimensioni" non è disponibile a livello di bucket
G-.

1
@ G-. Cosa succede se si selezionano tutte le cartelle del bucket?
Gvasquez,

4
@ G-. Tuttavia, la casella "Seleziona tutto" seleziona solo le cartelle e gli oggetti mostrati nella pagina, non tutte le cartelle / gli oggetti del bucket.
gparis,

2
@gparis buon punto. Vale la pena notare. Grazie. Quindi sembra che nella console non abbiamo un'opzione se ci sono più file o cartelle di quanti possano essere visualizzati su una singola pagina
G-.

50

Se si utilizza lo strumento da riga di comando s3cmd , è possibile ottenere un elenco ricorsivo di un determinato bucket, inoltrandolo in un file di testo.

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

Quindi in Linux è possibile eseguire un wc -l sul file per contare le righe (1 riga per oggetto).

wc -l listing.txt

Il -rcomando in è per --recursive, quindi dovrebbe funzionare anche per le sottocartelle.
Deepak Joy,

3 note su questo. a.) dovresti usare aws s3 lspiuttosto che s3cmd perché è più veloce. b.) Per secchi di grandi dimensioni può richiedere molto tempo. Ci sono voluti circa 5 minuti per i file 1mil. c.) Vedi la mia risposta di seguito sull'uso di cloudwatch.
mastaBlasta,

46

Ora esiste una soluzione semplice con l'API S3 (disponibile nel cli AWS):

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

o per una cartella specifica:

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

1
Raffaele, la tua query sulla cartella funziona alla grande, tranne quando la cartella è vuota o non esiste, quindi ottieni: In function length (), tipo non valido per valore: Nessuno, previsto uno di: ['string', 'array' , "oggetto"], ricevuto: "null" Esiste un modo per renderlo solo in uscita 0 se la cartella è vuota o non esce?
user3591836

1
Ottengo Illegal token value '(Contents[])]' (versione 1.2.9 di aws-cli), quando si usa --bucket my-buckete A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existquando si usa --bucket s3://my-bucket. (Esiste sicuramente, e ha oltre 1000 file.)
Darren Cook,

@DarrenCook rimuove s3: // dal nome del bucket. Il client non sembra supportare il protocollo.
Sriranjan Manjunath,

Questo è molto più veloce degli esempi wc -l. Con i miei secchi conta circa 3-4k oggetti / sec. Quindi ~ 5 minuti per milione di oggetti. "Ottieni dimensioni" nella GUI Web S3 probabilmente utilizza qualcosa di simile sotto il cofano poiché impiega all'incirca lo stesso tempo.
notpeter

Per benne MOLTO grandi, questa è stata l'unica soluzione che ha funzionato per me in un tempo ragionevole da (meno di 20 minuti)
Nick Sarafa,

40

Puoi utilizzare le metriche di AWS cloudwatch per s3 per vedere il conteggio esatto per ogni bucket. metrica cloudwatch quando si seleziona bucket


Penso che questa sia la risposta migliore
Oktav,

L'unica vera risposta, senza fare qualcosa di ridicolo come elencare 1m + chiavi. Ho dimenticato che era lì.
Andrew Backer,

Questo ha bisogno di più voti. Ogni altra soluzione si ridimensiona male in termini di costi e tempi.
Aaron R.

5

Vai a Fatturazione AWS, quindi rapporti, quindi Rapporti utilizzo AWS. Seleziona Amazon Simple Storage Service, quindi Operation StandardStorage. Quindi è possibile scaricare un file CSV che include un UsageType di StorageObjectCount che elenca il conteggio degli articoli per ciascun bucket.


4

Puoi facilmente ottenere il conteggio totale e la cronologia se vai alla scheda "Gestione" della console s3 e fai clic su "Metriche" ... Schermata della scheda


potresti aggiornare l'immagine per mostrare il NumberOfObjects (count/day)grafico? Sarebbe meglio poiché è direttamente correlato alla domanda. Nel tuo screenshot, stai mostrando ciò BucketSizeBytes (bytes/day)che, sebbene utile, non è direttamente correlato al problema.
Guzmonne,

1
A partire dal 2019, questa dovrebbe essere la risposta accettata. Tutto il resto è obsoleto o lento.
C Johnson,

2

L'API restituirà l'elenco con incrementi di 1000. Controllare la proprietà IsTruncated per vedere se ce ne sono ancora. In tal caso, è necessario effettuare un'altra chiamata e passare l'ultimo tasto ottenuto come proprietà Marker nella chiamata successiva. Quindi continueresti a eseguire il ciclo in questo modo fino a quando IsTruncated è falso.

Vedi questo documento di Amazon per maggiori informazioni: Scorrere i risultati su più pagine


2

Vecchio thread, ma ancora pertinente mentre cercavo la risposta fino a quando non ho appena capito. Volevo un conteggio dei file utilizzando uno strumento basato sulla GUI (cioè senza codice). Mi capita di usare già uno strumento chiamato 3Hub per i trasferimenti drag & drop da e verso S3. Volevo sapere quanti file avevo in un determinato bucket (non credo che la fatturazione li rompa per secchi).

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  

Avevo 20521 file nel bucket e il conteggio dei file è stato effettuato in meno di un minuto.


2

Ho usato lo script Python da scalablelogic.com (aggiungendo nella registrazione dei conteggi). Ha funzionato alla grande.

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

Solo così sei consapevole, questo non funziona con boto3. Di seguito ho fornito un suggerimento come risposta diversa.
fuzzygroup,

2

In s3cmd, esegui semplicemente il seguente comando (su un sistema Ubuntu):

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

13
Perché hai ripreso una domanda di 5 anni per pubblicare una copia mal formattata di una risposta esistente ?
Two-Bit Alchemist,

La risposta precedente ha reindirizzato l'output in un file txt inutilmente.
mjsa,

10
IMO questo dovrebbe essere un commento su quella risposta, quindi. Questa è una differenza davvero banale.
Two-Bit Alchemist,

2
Sembra una risposta degna, soprattutto perché la risposta selezionata per questa domanda inizia con "Non c'è modo ..." e @mjsa ha fornito una risposta di una riga.
Nan,

Questa non è una buona risposta perché non tiene conto degli oggetti con versione.
3h4x

2

Se si utilizza l'interfaccia della riga di comando di AWS su Windows, è possibile utilizzare Measure-Objectda PowerShell per ottenere il conteggio totale dei file, proprio come wc -lsu * nix.

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

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

Spero che sia d'aiuto.


2

Uno dei modi più semplici per contare il numero di oggetti in s3 è:

Passaggio 1: selezionare la cartella principale Passaggio 2: fare clic su Azioni -> Elimina (ovviamente, fare attenzione a non eliminarlo) Passaggio 3: attendere qualche minuto per visualizzare il numero di oggetti e le dimensioni totali.

Voto positivo se trovi la soluzione.


1

Nessuna delle API ti darà un conto perché in realtà non esiste alcuna API specifica di Amazon per farlo. Devi solo eseguire un elenco di contenuti e contare il numero di risultati che vengono restituiti.


Per qualche ragione, le librerie ruby ​​(right_aws / appoxy_aws) non elencheranno più dei primi 1000 oggetti in un bucket. Ce ne sono altri che elencheranno tutti gli oggetti?
campi

Quando richiedi l'elenco, forniscono un campo "NextToken", che puoi utilizzare per inviare nuovamente la richiesta con il token e ne elencherà di più.
Mitch Dempsey,

1

Dalla riga di comando nell'interfaccia della riga di comando di AWS, utilizzare ls plus --summarize. Ti fornirà l'elenco di tutti i tuoi articoli e il numero totale di documenti in un particolare bucket. Non ho provato questo con secchi contenenti sotto-secchi:

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

Richiede un po 'di tempo (ci sono voluti elencare i miei documenti 16 + K per circa 4 minuti), ma è più veloce che contare 1K alla volta.



0

3Hub è interrotto. C'è una soluzione migliore, puoi usare Transmit (solo Mac), quindi ti basta connetterti al tuo bucket e scegliere Show Item Countdal Viewmenu.


La trasmissione purtroppo mostra solo un massimo di 1000 articoli (e quindi il conteggio degli articoli è anche al massimo su 1000)
Tino

0

Puoi scaricare e installare il browser s3 da http://s3browser.com/ . Quando selezioni un bucket nell'angolo centrale destro puoi vedere il numero di file nel bucket. Tuttavia, la dimensione visualizzata non è corretta nella versione corrente.

Gübs


0

Il modo più semplice è utilizzare la console per sviluppatori, ad esempio, se sei su Chrome, scegli Strumenti per sviluppatori e puoi vedere quanto segue, puoi trovare e contare o fare una partita, come 280-279 + 1 = 2

...


Potresti aggiungere qualche dettaglio in più su come hai utilizzato gli strumenti di sviluppo per capire il numero totale di oggetti in un bucket.
Jugal Panchal,

0

Puoi potenzialmente utilizzare l'inventario di Amazon S3 che ti fornirà un elenco di oggetti in un file CSV




0

Puoi semplicemente eseguire questo comando cli per ottenere il conteggio totale dei file nel bucket o in una cartella specifica

Scansione intero secchio

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

puoi usare questo comando per entrare nei dettagli

aws s3api list-objects-v2 --bucket BUCKET_NAME

Scansiona una cartella specifica

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

Se stai cercando file specifici, diciamo .jpgimmagini, puoi fare quanto segue:

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

0

Di seguito è riportato come è possibile farlo utilizzando il client 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

Ecco la versione boto3 dello script Python incorporato sopra.

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: // bucket-name / folder-prefix-if-any --recursive | wc -l


Funziona per più di 1000 ha contato 4258 per me
KingAndrew

Le righe non corrispondono direttamente al numero di file. Perché hanno anche un'intera riga solo per la data e la directory.
CMCDragonkai,

Il comando funziona per un numero limitato di file. Nel mio caso, il numero di file è superiore a un milione e non dà mai alcun risultato. Ma è una buona opzione per file limitati.
Jugal Panchal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.