Come posso ottenere le dimensioni di un bucket Amazon S3?


289

Vorrei rappresentare graficamente la dimensione (in byte e il numero di elementi) di un bucket Amazon S3 e sto cercando un modo efficiente per ottenere i dati.

Gli strumenti s3cmd forniscono un modo per ottenere la dimensione totale del file utilizzando s3cmd du s3://bucket_name, ma sono preoccupato per la sua capacità di ridimensionamento poiché sembra che recuperi i dati su ogni file e calcoli la propria somma. Poiché Amazon addebita gli utenti in GB-Mesi, sembra strano che non espongano direttamente questo valore.

Sebbene l'API REST di Amazon restituisca il numero di elementi in un bucket, s3cmd non sembra esporlo. Potrei farlo, s3cmd ls -r s3://bucket_name | wc -lma sembra un trucco.

La libreria Ruby AWS :: S3 sembrava promettente, ma fornisce solo il numero di articoli bucket, non la dimensione totale del bucket.

Qualcuno è a conoscenza di altri strumenti o librerie della riga di comando (preferisci Perl, PHP, Python o Ruby) che forniscono modi per ottenere questi dati?


Ho scritto uno strumento per analizzare la dimensione del bucket: github.com/EverythingMe/ncdu-s3
omribahumi

20
Sono sorpreso che Amazon abbia caricato per lo spazio, ma non fornisce la dimensione totale occupata da un bucket S3 semplicemente attraverso il pannello S3.
Luca,

Per me la maggior parte delle risposte di seguito ha richiesto molto tempo per recuperare la dimensione del bucket, tuttavia questo script in pitone era molto più veloce della maggior parte delle risposte - slsmk.com/getting-the-size-of-an-s3-bucket-using -boto3-for-aws
Vaulstein il

Risposte:


168

La CLI AWS ora supporta il --queryparametro che accetta espressioni JMESPath .

Questo significa che puoi sommare i valori delle dimensioni dati list-objectsusando sum(Contents[].Size)e contando come length(Contents[]).

Questo può essere eseguito utilizzando l'interfaccia della riga di comando AWS ufficiale come di seguito ed è stato introdotto nel febbraio 2014

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

21
Per i secchi di grandi dimensioni (file # di grandi dimensioni), questo è estremamente lento. L'utilità Python s4cmd "du" è velocissima:s4cmd du s3://bucket-name
Brent Faust

È strano. Qual è il profilo generale del tuo secchio (superficiale e grasso / profondo e sottile)? Sembra che s3cmddovrebbe avere le stesse spese generali di AWS CLI. Nel codice mostra s3cmd una richiesta per ogni directory in un bucket.
Christopher Hackett,

22
per ottenerlo in un formato leggibile dall'uomo: 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,

21
Ora che AWS Cloudwatch offre una metrica per bucket "BucketSizeBytes", questa non è più la soluzione giusta. Vedi la risposta di Toukakoukan di seguito.
cce

2
s4cmd duè meraviglioso, grazie @Brent Faust! piccola nota (per gli interessati) che è necessario aggiungere -rper ottenere anche le dimensioni delle sottodirectory.
Greg Sadetsky,

330

Questo ora può essere fatto in modo banale solo con il client ufficiale della riga di comando AWS:

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

Documentazione ufficiale

Ciò accetta anche prefissi di percorso se non si desidera contare l'intero bucket:

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

23
Questa è la risposta migliore e aggiornata
Tim

2
D'accordo, questa è la risposta migliore.
Luis Artola,

25
Questo è molto lento per i bucket con molti file poiché in pratica elenca tutti gli oggetti nel bucket prima di mostrare il riepilogo e in quanto non è significativamente più veloce della risposta di @Christopher Hackett - tranne che questo è molto più rumoroso.
Guss,

Esegui su un'istanza EC2 con la stessa regione bucket per migliorare la latenza
juanmirocks

1
Questo mostrerà la dimensione di TUTTI i singoli file nella struttura di directory. Cosa succede se desidero solo le dimensioni totali per la directory?
Chris F,

130

Console AWS:

A partire dal 28 luglio 2015 è possibile ottenere queste informazioni tramite CloudWatch . Se desideri una GUI, vai alla console di CloudWatch : (Scegli regione>) Metriche> S3

Comando CLI AWS:

Questo è molto più veloce di alcuni degli altri comandi pubblicati qui, in quanto non esegue una query sulla dimensione di ciascun file singolarmente per calcolare la somma.

 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 : è necessario specificare sia StorageType che BucketName nell'argomento dimensioni, altrimenti non si otterranno risultati. Tutto quello che devi cambiare è la --start-date, --end-timee Value=toukakoukan.com.


Ecco uno script bash che puoi usare per evitare di doverlo specificare --start-datee --end-timemanualmente.

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

25
O nella console di CloudWatch : (Scegli regione>) Metriche> S3
Halil Özgür

3
Questa è di gran lunga la soluzione più semplice e veloce. Purtroppo la risposta è ancora solo al quarto posto.
luk2302,

Questo ha funzionato per il mio secchio con oltre 10 milioni di oggetti. Ma lo script bash non ha restituito nulla, ha dovuto andare alla GUI).
Petah,

1
Va anche notato che dovrai cambiare anche la regione
Majikman,

maggio 2018: gli errori di script conInvalid value ('1525354418') for param timestamp:StartTime of type timestamp
anneb

106

s3cmd può fare questo:

s3cmd du s3://bucket-name


Grazie. Ecco un po 'di tempismo. Su un bucket che contiene un filesystem deduplicato s3ql con circa un milione di file utilizzando circa 33 GB di dati non duplicati e circa 93000 oggetti s3, s3cmd du ha impiegato circa 4 minuti per calcolare la risposta. Sono curioso di sapere come si confronta con altri approcci come quello php descritto altrove qui.
nealmcb,

1
È lento perché la chiamata API SO ListObjects restituisce oggetti in pagine di 1000 oggetti. Dato che l'I / O è di gran lunga il fattore limitante, penso che qualsiasi soluzione sarà relativamente lenta su 93000 oggetti.
David Snabel-Caunt,

11
Anche s4cmd può fare la stessa cosa, con l'ulteriore vantaggio di eseguire il multithreading delle richieste all'API di S3 per calcolare il risultato più velocemente. Lo strumento non è stato aggiornato di recente, ma il passante Internet può trovarlo utile.
Nick Chammas,

s4cmd restituisce solo 0 per me e ritorna BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.per i bucket con caratteri maiuscoli.
Lakitu,

22

Se scarichi un rapporto sull'utilizzo , puoi rappresentare graficamente i valori giornalieri per il TimedStorage-ByteHrscampo.

Se vuoi quel numero in GiB, dividi semplicemente per 1024 * 1024 * 1024 * 24(cioè GiB-ore per un ciclo di 24 ore). Se vuoi il numero in byte, dividi solo per 24 e traccia il grafico.


19

Utilizzando gli strumenti ufficiali della riga di comando di AWS s3:

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

Questo è un comando migliore, basta aggiungere i seguenti 3 parametri --summarize --human-readable --recursivedopo aws s3 ls. --summarizenon è richiesto, anche se dà un bel tocco sulla dimensione totale.

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

1
Fornisci il link a dove Amazon lo afferma effettivamente per favore. Non riesco a trovarlo
lobi,



4
Questa risposta ha funzionato nel modo migliore e più veloce per me.
Mirò,

2
risposta migliore e più veloce!
PlagTag

11

s4cmd è il modo più veloce che ho trovato (un'utilità da riga di comando scritta in Python):

pip install s4cmd

Ora per calcolare l'intera dimensione della benna utilizzando più thread:

s4cmd du -r s3://bucket-name

6
No, s4cmd du s3://123123drinknon restituirà semplicemente la dimensione del secchio. Per ottenere la dimensione del bucket, aggiungi il ricorsivo -r, in questo modo: s4cmd du -r s3: // 123123drink
George Chalhoub

1
Sì, buon punto @BukLau (aggiunto -rall'esempio sopra per evitare confusione quando le persone usano cartelle simulate su S3).
Brent Faust,

6

Ho usato l' API REST / Curl S3 elencata in precedenza in questo thread e ho fatto questo:

<?php
if (!class_exists('S3')) require_once 'S3.php';

// Instantiate the class
$s3 = new S3('accessKeyId', 'secretAccessKey');
S3::$useSSL = false;

// List your buckets:
echo "S3::listBuckets(): ";
echo '<pre>' . print_r($s3->listBuckets(), 1). '</pre>';

$totalSize = 0;
$objects = $s3->getBucket('name-of-your-bucket');
foreach ($objects as $name => $val) {
    // If you want to get the size of a particular directory, you can do
    // only that.
    // if (strpos($name, 'directory/sub-directory') !== false)
    $totalSize += $val['size'];
}

echo ($totalSize / 1024 / 1024 / 1024) . ' GB';
?>

6

È possibile utilizzare l'utilità s3cmd, ad esempio:

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/

5

Quindi, trollando attraverso l'API e riproducendo alcune stesse query, S3 produrrà l'intero contenuto di un bucket in una richiesta e non dovrà scendere nelle directory. I risultati quindi richiedono solo il riepilogo attraverso i vari elementi XML e non le chiamate ripetute. Non ho un bucket di campionamento che contenga migliaia di articoli, quindi non so quanto si ridimensionerà, ma sembra ragionevolmente semplice.


Questa sembra essere l'opzione migliore. Aggiornerò questo post in futuro se si ridimensiona male e devo fare qualcos'altro. La libreria che ha finito per fornire un facile accesso ai risultati delle API non elaborate era questa PHP: undesigned.org.za/2007/10/22/amazon-s3-php-class
Garret Heaton,

Non è limitato solo ai primi 1000 articoli?
Charlie Schliesser,

4

... Un po 'in ritardo, ma il modo migliore che ho trovato è usare i rapporti nel portale AWS. Ho creato una classe PHP per il download e l'analisi dei report. Con esso puoi ottenere il numero totale di oggetti per ogni bucket, dimensione totale in GB o ore byte e altro.

Dai un'occhiata e fammi sapere se è stato utile

AmazonTools


Questa è una soluzione interessante, anche se un po 'hacker. Preoccupato per il fatto che si rompa se / quando Amazon cambia sito, ma potrei doverlo provare una volta che ho abbastanza oggetti che altrimenti diventa troppo lento. Un altro vantaggio di questo approccio è che non ti viene addebitato alcun costo per le chiamate API.
Garret Heaton,

. . . è un presupposto ma, se Amazon cambia l'aspetto del loro sito, dubito che cambierebbe molto il back-end, il che significa che le attuali query GET e POST dovrebbero funzionare. Manterrò la classe nel caso in cui si interrompa comunque mentre la uso spesso.

3

Ti consiglio di utilizzare il Rapporto di utilizzo S3 per i bucket di grandi dimensioni , vedi il mio How To su come ottenerlo Fondamentalmente devi scaricare il Rapporto di utilizzo per il servizio S3 per l'ultimo giorno con Archiviazione a tempo - Byte Hrs e analizzarlo per ottenere l'utilizzo del disco.

cat report.csv | awk -F, '{printf "%.2f GB %s %s \n", $7/(1024**3 )/24, $4, $2}' | sort -n

3

La documentazione di AWS spiega come farlo:

aws s3 ls s3://bucketnanme --recursive --human-readable --summarize

Questo è l'output che ottieni:

2016-05-17 00:28:14    0 Bytes folder/
2016-05-17 00:30:57    4.7 KiB folder/file.jpg
2016-05-17 00:31:00  108.9 KiB folder/file.png
2016-05-17 00:31:03   43.2 KiB folder/file.jpg
2016-05-17 00:31:08  158.6 KiB folder/file.jpg
2016-05-17 00:31:12   70.6 KiB folder/file.png
2016-05-17 00:43:50   64.1 KiB folder/folder/folder/folder/file.jpg

Total Objects: 7

   Total Size: 450.1 KiB

2

Per un approccio davvero a bassa tecnologia: usa un client S3 in grado di calcolare le dimensioni per te. Sto usando Panic's Transmit, fare clic su un bucket, fare "Ottieni informazioni" e fare clic sul pulsante "Calcola". Non sono sicuro di quanto sia veloce o preciso rispetto ad altri metodi, ma sembra restituire la dimensione che mi aspettavo fosse.


2

Dato che ci sono così tante risposte, ho pensato di presentare la mia. Ho scritto la mia implementazione in C # usando LINQPad. Copia, incolla e inserisci la chiave di accesso, la chiave segreta, l'endpoint della regione e il nome del bucket che desideri interrogare. Inoltre, assicurati di aggiungere il pacchetto nuget AWSSDK.

Provando contro uno dei miei secchi, mi ha dato un conteggio di 128075 e una dimensione di 70,6 GB. So che è preciso al 99,9999%, quindi sono bravo con il risultato.

void Main() {
    var s3Client = new AmazonS3Client("accessKey", "secretKey", RegionEndpoint.???);
    var stop = false;
    var objectsCount = 0;
    var objectsSize = 0L;
    var nextMarker = string.Empty;

    while (!stop) {
        var response = s3Client.ListObjects(new ListObjectsRequest {
            BucketName = "",
            Marker = nextMarker
        });

        objectsCount += response.S3Objects.Count;
        objectsSize += response.S3Objects.Sum(
            o =>
                o.Size);
        nextMarker = response.NextMarker;
        stop = response.S3Objects.Count < 1000;
    }

    new {
        Count = objectsCount,
        Size = objectsSize.BytesToString()
    }.Dump();
}

static class Int64Extensions {
    public static string BytesToString(
        this long byteCount) {
        if (byteCount == 0) {
            return "0B";
        }

        var suffix = new string[] { "B", "KB", "MB", "GB", "TB", "PB", "EB" };
        var longBytes = Math.Abs(byteCount);
        var place = Convert.ToInt32(Math.Floor(Math.Log(longBytes, 1024)));
        var number = Math.Round(longBytes / Math.Pow(1024, place), 1);

        return string.Format("{0}{1}", Math.Sign(byteCount) * number, suffix[place]);
    }
}

2

Se vuoi ottenere le dimensioni dalla Console AWS:

  1. Vai su S3 e fai clic sul nome del bucket
  2. Seleziona la scheda "Gestione"

inserisci qui la descrizione dell'immagine

  1. Seleziona la scheda Metriche

Per impostazione predefinita, dovresti vedere la metrica di archiviazione del bucket


1

So che questa è una domanda precedente, ma ecco un esempio di PowerShell:

Get-S3Object -BucketName <buckename> | select key, size | foreach {$A += $_.size}

$A contiene la dimensione del bucket e esiste un parametro keyname se si desidera solo la dimensione di una cartella specifica in un bucket.


Prima esegui Get-object..line e poi esegui $ A (per chi non ha familiarità con PowerShell)
Faiz

1

Per controllare tutte le dimensioni dei bucket, prova questo script bash

s3list=`aws s3 ls | awk  '{print $3}'`
for s3dir in $s3list
do
    echo $s3dir
    aws s3 ls "s3://$s3dir"  --recursive --human-readable --summarize | grep "Total Size"
done

Questo ha funzionato alla grande.
Mike Barlow - BarDev

Catturare l'output in una variabile in modo da poterlo scorrere è un antipattern inutile.
Tripleee

1

Puoi usare s3cmd:

s3cmd du s3://Mybucket -H

o

s3cmd du s3://Mybucket --human-readable

Fornisce gli oggetti totali e le dimensioni del secchio in una forma molto leggibile.


Fa dulista traversata tutti gli oggetti o recuperare i metadati? Vorrei davvero una versione API della versione dei report o ciò che viene visualizzato nella console aws ...
user67327

0

Ehi, esiste uno strumento di ricerca dei metadati per AWS S3 su https://s3search.p3-labs.com/ . Questo strumento fornisce statistiche sugli oggetti in un bucket con la ricerca sui metadati.


0

Anche Hanzo S3 Tools fa questo. Una volta installato, puoi fare:

s3ls -s -H bucketname

Ma credo che questo sia anche sommato sul lato client e non recuperato tramite l'API AWS.


0

Tramite il programma Cloudberry è anche possibile elencare la dimensione del bucket, la quantità di cartelle e i file totali, facendo clic su "proprietà" proprio nella parte superiore del bucket.


0

Se non si desidera utilizzare la riga di comando, su Windows e OSX, esiste un'app per la gestione dei file remoti per scopi generici chiamata Cyberduck . Accedi a S3 con la tua coppia di chiavi di accesso / segrete, fai clic con il pulsante destro del mouse sulla directory, fai clic Calculate.


0

Ho scritto uno script Bash, s3-du.sh che elencherà i file nel bucket con s3ls e stamperà il conteggio dei file e dimensioni come

s3-du.sh testbucket.jonzobrist.com
149 files in bucket testbucket.jonzobrist.com
11760850920 B
11485205 KB
11216 MB
10 GB

Script completo:

#!/bin/bash

if [ “${1}” ]
then
NUM=0
COUNT=0
for N in `s3ls ${1} | awk ‘{print $11}’ | grep [0-9]`
do
NUM=`expr $NUM + $N`
((COUNT++))
done
KB=`expr ${NUM} / 1024`
MB=`expr ${NUM} / 1048576`
GB=`expr ${NUM} / 1073741824`
echo “${COUNT} files in bucket ${1}”
echo “${NUM} B”
echo “${KB} KB”
echo “${MB} MB”
echo “${GB} GB”
else
echo “Usage : ${0} s3-bucket”
exit 1
fi    

Fa la dimensione della sottodirectory, poiché Amazon restituisce il nome della directory e la dimensione di tutto il suo contenuto.


0

CloudWatch ha ora un dashboard di servizio S3 predefinito che lo elenca in un grafico chiamato "Dimensione media bucket". Penso che questo link funzionerà per chiunque abbia già effettuato l'accesso alla Console AWS:


-1

Il modo seguente utilizza AWS PHP SDK per ottenere la dimensione totale del bucket.

// make sure that you are using correct region (where the bucket is) to get new Amazon S3 client
$client = \Aws\S3\S3Client::factory(array('region' => $region));

// check if bucket exists
if (!$client->doesBucketExist($bucket, $accept403 = true)) {
    return false;
}
// get bucket objects
$objects = $client->getBucket(array('Bucket' => $bucket));

$total_size_bytes = 0;
$contents = $objects['Contents'];

// iterate through all contents to get total size
foreach ($contents as $key => $value) {
   $total_bytes += $value['Size'];
}
$total_size_gb = $total_size_bytes / 1024 / 1024 / 1024;

-1

Questo funziona per me ..

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

3
Puoi aggiungere qualche dettaglio in più?
Pierre.Vriens,

1
Questa è essenzialmente la stessa soluzione di un'altra risposta pubblicata circa un anno prima.
Louis,
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.