Jak mogę uzyskać rozmiar wiadra Amazon S3?

289

Chciałbym wykreślić wykres wielkości (w bajtach i # elementów) segmentu Amazon S3 i szukam wydajnego sposobu na uzyskanie danych.

W s3cmd narzędzia zapewniają sposób, aby uzyskać całkowity rozmiar plików przy użyciu s3cmd du s3://bucket_name, ale martwię się o jego zdolność do skalowania, ponieważ wygląda na to, że pobiera dane o każdym pliku i oblicza własną sumę. Ponieważ Amazon pobiera opłaty od użytkowników w GB-miesięcznie, wydaje się dziwne, że nie ujawniają tej wartości bezpośrednio.

Chociaż interfejs API REST firmy Amazon zwraca liczbę elementów w segmencie, s3cmd nie wydaje się go ujawniać. Mógłbym to zrobić, s3cmd ls -r s3://bucket_name | wc -lale to wygląda na włamanie.

Biblioteka Ruby AWS :: S3 wyglądała obiecująco, ale zapewnia tylko liczbę elementów segmentu, a nie całkowity rozmiar segmentu.

Czy ktoś wie o innych narzędziach lub bibliotekach wiersza poleceń (preferuje Perl, PHP, Python lub Ruby), które zapewniają sposoby uzyskiwania tych danych?

Garret Heaton
źródło
Napisałem narzędzie do analizy wielkości wiadra: github.com/EverythingMe/ncdu-s3
omribahumi,
19
Dziwi mnie, że Amazon pobiera opłatę za miejsce, ale nie podaje całkowitego rozmiaru zajętego przez wiadro S3 po prostu przez panel S3.
Łukasz
Dla mnie większość poniższych odpowiedzi zajęła sporo czasu, aby pobrać rozmiar segmentu, jednak ten skrypt w Pythonie był o wiele szybszy niż większość odpowiedzi - slsmk.com/getting-the-size-of-an-s3-bucket-using -boto3-for-aws
Vaulstein

Odpowiedzi:

168

Interfejs AWS CLI obsługuje teraz --queryparametr, który przyjmuje wyrażenia JMESPath .

Oznacza to, że możesz zsumować wartości wielkości podane za list-objectspomocą sum(Contents[].Size)i policzyć jak length(Contents[]).

Można to uruchomić przy użyciu oficjalnego interfejsu AWS CLI, jak pokazano poniżej, i wprowadzono go w lutym 2014 r

 aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"
Christopher Hackett
źródło
21
W przypadku dużych segmentów (duże pliki #) jest to wyjątkowo powolne. Narzędzie Python s4cmd „du” jest błyskawicznie szybkie:s4cmd du s3://bucket-name
Brent Faust
To jest dziwne. Jaki jest ogólny profil twojego wiadra (płytki i gruby / głęboki i cienki)? Wygląda na to, że s3cmdpowinien mieć takie same koszty ogólne jak AWS CLI. W kodzie pokazuje s3cmd żądanie dla każdego katalogu w segmencie.
Christopher Hackett
22
aby uzyskać go w formacie czytelnym dla człowieka: 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
Teraz, gdy AWS Cloudwatch oferuje dane „BucketSizeBytes” dla każdego segmentu, nie jest to już właściwe rozwiązanie. Zobacz odpowiedź Toukakoukan poniżej.
cce
2
s4cmd dujest cudowne, dziękuję @Brent Faust! mała uwaga (dla zainteresowanych), którą należy dodać, -raby uzyskać również rozmiary podkatalogów.
Greg Sadetsky
330

Można to teraz zrobić w trywialny sposób za pomocą tylko oficjalnego klienta wiersza poleceń AWS:

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

Oficjalna dokumentacja

To akceptuje również prefiksy ścieżek, jeśli nie chcesz liczyć całego segmentu:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory
philwills
źródło
23
To najlepsza i aktualna odpowiedź
Tim
2
Zgadzam się, to najlepsza odpowiedź.
Luis Artola,
24
Jest to bardzo powolne w przypadku segmentów z wieloma plikami, ponieważ w zasadzie wyświetla listę wszystkich obiektów w segmencie przed wyświetleniem podsumowania, a tym samym nie jest znacznie szybsze niż odpowiedź @Christopher Hackett - z wyjątkiem tego, że jest znacznie głośniejszy.
Guss,
Uruchom instancję EC2 z regionem tego samego segmentu, aby poprawić opóźnienie
juanmirocks
1
To pokaże rozmiar WSZYSTKICH pojedynczych plików w drzewie katalogów. Co jeśli chcę tylko całkowity rozmiar katalogu?
Chris F,
130

Konsola AWS:

Od 28 lipca 2015 r. Możesz uzyskać te informacje za pośrednictwem CloudWatch . Jeśli chcesz mieć GUI, przejdź do konsoli CloudWatch : (Wybierz Region>) Metryki> S3

Polecenie AWS CLI:

Jest to o wiele szybsze niż niektóre inne polecenia zamieszczone tutaj, ponieważ nie sprawdza wielkości każdego pliku indywidualnie w celu obliczenia sumy.

 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

Ważne : Musisz podać zarówno StorageType, jak i BucketName w argumencie Dimensions, w przeciwnym razie nie otrzymasz żadnych wyników. Wszystko, czego potrzebujesz, aby zmienić to --start-date, --end-timei Value=toukakoukan.com.


Oto skrypt bash można użyć, aby uniknąć konieczności określania --start-datei --end-timeręcznie.

#!/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
Sam Martin
źródło
25
Lub w konsoli CloudWatch : (Wybierz Region>) Metryki> S3
Halil Özgür
3
To zdecydowanie najłatwiejsze i najszybsze rozwiązanie. Niestety odpowiedź wciąż jest tylko na czwartym miejscu.
luk2302
To zadziałało dla mojego wiadra z 10 milionami + przedmiotów. Ale skrypt bash nic nie zwrócił, musiał przejść do GUI).
Petah,
1
Należy również zauważyć, że musisz również zmienić region
majikman
maj 2018: błędy skryptu zInvalid value ('1525354418') for param timestamp:StartTime of type timestamp
anneb
106

s3cmd może to zrobić:

s3cmd du s3://bucket-name

Stefan Ticu
źródło
Dzięki. Oto trochę czasu. Na wiadrze zawierającym zduplikowany system plików s3ql z około milionem plików wykorzystujących około 33 GB nieuplikowanych danych i około 93000 obiektów s3, s3cmd du zajęło około 4 minut, aby obliczyć odpowiedź. Jestem ciekawy, jak to porównać z innymi podejściami, takimi jak php opisany gdzie indziej tutaj.
nealmcb,
1
Jest powolny, ponieważ wywołanie API S3 ListObjects zwraca obiekty na stronach 1000 obiektów. Ponieważ I / O jest zdecydowanie czynnikiem ograniczającym, myślę, że każde rozwiązanie będzie względnie wolne dla 93 000 obiektów.
David Snabel-Caunt,
11
s4cmd może również zrobić to samo, z dodatkową korzyścią wielowątkowości żądań do interfejsu API S3 w celu szybszego obliczenia wyniku. Narzędzie nie zostało ostatnio zaktualizowane, ale przechodzący przez Internet może okazać się przydatny.
Nick Chammas,
s4cmd po prostu zwraca mi 0, i zwraca BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.wiaderka z dużymi literami.
Lakitu,
22

Jeśli pobierzesz raport użytkowania , możesz sporządzić wykres wartości dziennych dla TimedStorage-ByteHrspola.

Jeśli chcesz tę liczbę w GiB, po prostu podziel przez 1024 * 1024 * 1024 * 24(to GiB-godziny dla cyklu 24-godzinnego). Jeśli chcesz liczbę w bajtach, po prostu podziel przez 24 i odsuń.

Christopher Schultz
źródło
19

Korzystanie z oficjalnych narzędzi wiersza polecenia AWS s3:

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

To jest lepsze poleceń, wystarczy dodać następujące 3 parametry --summarize --human-readable --recursivepo aws s3 ls. --summarizenie jest wymagane, ale daje miły akcent w całkowitym rozmiarze.

aws s3 ls s3://bucket/folder --summarize --human-readable --recursive
dyltini
źródło
1
Podaj link do miejsca, w którym Amazon faktycznie to stwierdza. Nie mogę tego znaleźć
lobi
4
Ta odpowiedź działała dla mnie najlepiej i najszybciej.
Miro
2
najlepsza i najszybsza odpowiedź!
PlagTag
11

s4cmd to najszybszy sposób, jaki znalazłem (narzędzie wiersza polecenia napisane w Pythonie):

pip install s4cmd

Teraz obliczyć cały rozmiar wiadra przy użyciu wielu wątków:

s4cmd du -r s3://bucket-name
Brent Faust
źródło
6
Nie, s4cmd du s3://123123drinknie zwróci po prostu rozmiaru wiadra. Aby uzyskać rozmiar wiadra, dodajesz rekurencję -r, w ten sposób: s4cmd du -r s3: // 123123drink
George Chalhoub
1
Tak, dobra uwaga @BukLau (dodana -rdo powyższego przykładu, aby uniknąć zamieszania, gdy ludzie używają symulowanych folderów na S3).
Brent Faust
6

Użyłem interfejsu API REST / Curl S3 wymienionego wcześniej w tym wątku i zrobiłem to:

<?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';
?>
Vic
źródło
6

Możesz użyć narzędzia s3cmd, np .:

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/
użytkownik319660
źródło
5

Przeszukując interfejs API i odtwarzając te same zapytania, S3 utworzy całą zawartość segmentu w jednym żądaniu i nie musi schodzić do katalogów. Wyniki wymagają jedynie zsumowania różnych elementów XML, a nie powtarzanych wywołań. Nie mam próbnego wiadra, które zawiera tysiące przedmiotów, więc nie wiem, jak dobrze będzie skalować, ale wydaje się dość proste.

Jim Zajkowski
źródło
To wydaje się być najlepszą opcją. Zaktualizuję ten post w przyszłości, jeśli będzie on słabo skalowany i będę musiał zrobić coś innego. Biblioteką, która ostatecznie zapewniła łatwy dostęp do nieprzetworzonych wyników API, była ta PHP: undesigned.org.za/2007/10/22/amazon-s3-php-class
Garret Heaton
Czy to nie ogranicza się tylko do pierwszych 1000 przedmiotów?
Charlie Schliesser,
4

... Trochę za późno, ale najlepszym sposobem, jaki znalazłem, jest skorzystanie z raportów w portalu AWS. Zrobiłem klasę PHP do pobierania i analizowania raportów. Dzięki niemu możesz uzyskać całkowitą liczbę obiektów dla każdego segmentu, całkowity rozmiar w GB lub bajt godz. I więcej.

Sprawdź to i daj mi znać, czy było to pomocne

AmazonTools


źródło
To ciekawe rozwiązanie, choć trochę hackerskie. Martwiłem się, że zepsuje się, jeśli / kiedy Amazon zmieni stronę, ale być może będę musiał to wypróbować, gdy będę mieć wystarczająco dużo obiektów, aby odwrotnie stało się zbyt wolne. Inną zaletą tego podejścia jest to, że nie naliczamy żadnych opłat za połączenia API.
Garret Heaton,
. . . jest to założenie, ale jeśli Amazon zmieni wygląd swojej witryny, wątpię, by znacznie zmieniły zaplecze, co oznacza, że ​​obecne zapytania GET i POST powinny działać. Utrzymam klasę na wypadek, gdyby i tak się zepsuła, ponieważ często z niej korzystam.
3

Polecam korzystanie z raportu użytkowania S3 w przypadku dużych segmentów , zobacz moje instrukcje na temat tego, jak go uzyskać. Zasadniczo musisz pobrać raport użytkowania usługi S3 dla ostatniego dnia z Timed Storage - Bajt godz. I przeanalizować, aby uzyskać użycie dysku.

cat report.csv | awk -F, '{printf "%.2f GB %s %s \n", $7/(1024**3 )/24, $4, $2}' | sort -n
Jakub Głazik
źródło
3

Dokumentacja AWS mówi, jak to zrobić:

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

To jest wynik, który otrzymujesz:

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
奉 太郎 折 木
źródło
2

Dla naprawdę niskiego poziomu technologii: użyj klienta S3, który może obliczyć rozmiar dla Ciebie. Używam Panic's Transmit, kliknij wiadro, zrób „Uzyskaj informacje” i kliknij przycisk „Oblicz”. Nie jestem pewien, jak szybki lub dokładny jest w stosunku do innych metod, ale wydaje się, że oddaje rozmiar, którego się spodziewałem.

zmippie
źródło
2

Ponieważ jest tak wiele odpowiedzi, pomyślałem, że wrócę z własnymi. Swoją implementację napisałem w języku C # przy użyciu LINQPad. Skopiuj, wklej i wprowadź klucz dostępu, klucz tajny, punkt końcowy regionu i nazwę segmentu, do którego chcesz wysłać zapytanie. Pamiętaj też, aby dodać pakiet nuget AWSSDK.

Testowałem na jednym z moich wiader, co dało mi liczbę 128075 i rozmiar 70,6 GB. Wiem, że jest to 99,9999% dokładności, więc jestem dobry z wynikiem.

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]);
    }
}
Gup3rSuR4c
źródło
2

Jeśli chcesz uzyskać rozmiar z konsoli AWS:

  1. Przejdź do S3 i kliknij nazwę wiadra
  2. Wybierz zakładkę „Zarządzanie”

wprowadź opis zdjęcia tutaj

  1. Wybierz kartę Metryki

Domyślnie powinna zostać wyświetlona Metryka przechowywania wiadra

Hooman Bahreini
źródło
1

Wiem, że to starsze pytanie, ale oto przykład PowerShell:

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

$A zawiera rozmiar segmentu i istnieje parametr keyname, jeśli chcesz tylko rozmiar określonego folderu w segmencie.

DCJeff
źródło
Najpierw uruchom linię Get-object..line, a następnie $ A (dla tych, którzy nie znają PowerShell)
Faiz
1

Aby sprawdzić rozmiar wszystkich segmentów, wypróbuj ten skrypt 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
Giulio Roggero
źródło
To działało świetnie.
Mike Barlow - BarDev
Przechwytywanie danych wyjściowych w zmiennej tylko po to, aby można było ją zapętlić, jest marnotrawstwem.
tripleee
1

Możesz użyć s3cmd:

s3cmd du s3://Mybucket -H

lub

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

Daje całkowitą liczbę obiektów i rozmiar wiadra w bardzo czytelnej formie.

bpathak
źródło
Czy dutrawers wyświetla listę wszystkich obiektów, czy pobiera metadane? Naprawdę chciałbym wersję api wersji raportów lub to, co jest wyświetlane w konsoli aws ...
user67327
0

Hej, istnieje narzędzie wyszukiwania metdanych dla AWS S3 na https://s3search.p3-labs.com/. To narzędzie podaje statystyki dotyczące obiektów w wiadrze z wyszukiwaniem metadanych.

pyth
źródło
0

Robi to również Hanzo S3 Tools . Po zainstalowaniu możesz:

s3ls -s -H bucketname

Ale wierzę, że jest to również sumowane po stronie klienta i nie jest pobierane przez API AWS.

Ville
źródło
0

W programie Cloudberry można również wymienić rozmiar segmentu, liczbę folderów i całkowitą liczbę plików, klikając „właściwości” tuż nad segmentem.

KiKo
źródło
0

Jeśli nie chcesz używać wiersza polecenia, w systemach Windows i OSX, istnieje aplikacja do zdalnego zarządzania plikami ogólnego przeznaczenia o nazwie Cyberduck . Zaloguj się do S3 za pomocą pary klucz dostępu / klucz tajny, kliknij katalog prawym przyciskiem myszy, kliknij Calculate.

jpillora
źródło
0

Napisałem skrypt Bash, s3-du.sh, który wyświetli listę plików w wiadrze z s3ls oraz wyświetli liczbę plików i rozmiary, takie jak

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

Pełny skrypt:

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

Robi rozmiar podkatalogu, ponieważ Amazon zwraca nazwę katalogu i rozmiar całej jego zawartości.

Jon Zobrist
źródło
0

CloudWatch ma teraz domyślny pulpit nawigacyjny usługi S3, który wyświetla go na wykresie o nazwie „Średnia wielkość bajtu wielkości”. Myślę, że ten link będzie działał dla każdego, kto jest już zalogowany do konsoli AWS:

Flickerfly
źródło
-1

Poniższy sposób wykorzystuje AWS PHP SDK, aby uzyskać całkowity rozmiar segmentu.

// 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;
Shriganesh Shintre
źródło
-1

To działa dla mnie ..

aws s3 ls s3://bucket/folder/ --recursive | awk '{sz+=$3} END {print sz/1024/1024 "MB"}'
GrantO
źródło
3
Czy możesz dodać jeszcze kilka szczegółów?
Pierre.Vriens
1
Jest to zasadniczo to samo rozwiązanie, co inna odpowiedź opublikowana około rok wcześniej.
Louis