Jak mogę sprawdzić, ile obiektów zapisałem w zasobniku S3?


155

O ile czegoś nie brakuje, wydaje się, że żaden z interfejsów API, które oglądałem, nie powie Ci, ile obiektów znajduje się w zasobniku / folderze S3 (prefiks). Czy jest jakiś sposób, aby policzyć?


To pytanie może być pomocne: stackoverflow.com/questions/701545/…
— Brendan Long

1
Rozwiązanie istnieje teraz w 2015 roku: stackoverflow.com/a/32908591/578989
— Mayank Jaiswal

Zobacz moją odpowiedź poniżej: stackoverflow.com/a/39111698/996926
— advncd

Odpowiedzi:


39

Nie ma sposobu, chyba że ty

  1. wymień je wszystkie w partiach po 1000 (co może być wolne i obciążać pasmo - amazon wydaje się nigdy nie kompresować odpowiedzi XML), lub

  2. zaloguj się na swoje konto na S3 i przejdź do Konto - Użytkowanie. Wygląda na to, że dział rozliczeń dokładnie wie, ile obiektów przechowujesz!

Samo pobranie listy wszystkich obiektów zajmie trochę czasu i będzie kosztować trochę pieniędzy, jeśli przechowujesz 50 milionów obiektów.

Zobacz także ten wątek dotyczący StorageObjectCount - który znajduje się w danych użycia.

Interfejs API S3, aby uzyskać przynajmniej podstawy, nawet jeśli miał kilka godzin, byłby świetny.


Nawiasem mówiąc, to połączenie jest martwe.
— pola


Jeśli jesteś leniwy jak ja, Newvem zasadniczo robi to w Twoim imieniu i agreguje / śledzi wyniki na poziomie wiadra na Twoim koncie S3.
— rcoup

2
Czy możesz zaktualizować swoją odpowiedź, aby zawierała odpowiedź @ MayankJaiswal?
— Joseph Casey

1
dział rozliczeń wie wszystko! nic dziwnego, że mają moc przypadkowego
— zerwania

256

Korzystanie z interfejsu wiersza polecenia AWS

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

lub

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

Uwaga: powyższe polecenie Cloudwatch wydaje się działać dla niektórych, a nie dla innych. Omówiono tutaj: https://forums.aws.amazon.com/thread.jspa?threadID=217050

Korzystanie z konsoli internetowej AWS

Możesz spojrzeć na sekcję metryczną Cloudwatch, aby uzyskać przybliżoną liczbę przechowywanych obiektów. wprowadź opis obrazu tutaj

Mam około 50 milionów produktów, a ich liczenie zajęło ponad godzinę aws s3 ls


18
To powinno być bliżej szczytu.
— Joseph Casey,

3
@JosephMCasey Zgadzam się. Działa to również, aby podać liczbę obiektów w katalogu z zasobnikiem w następujący sposób:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
— tim peterson

1
Daje ten błąd, gdy uruchomiłem powyższy wiersz polecenia cmd - „wc” nie jest rozpoznawane jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy. - Jestem w tym całkiem nowy, więc czy ktoś może dać rozwiązanie?
— Sandun

Ostrzeżenie, że CloudWatch nie wydaje się zbyt wiarygodne. Mam plik mp4 w jednym zasobniku, który CloudWatch (metryka NumberOfObjects) liczy jako 2300 oddzielnych obiektów. Mam poprawny numer z AWS CLI.
— AlexK

Dlaczego „średnia”? Czy ktoś nie chciałby zamiast tego „Sum”?
— ffxsam

150

Jest --summarizeprzełącznik, który zawiera podsumowanie informacji o zasobniku (np. Liczba obiektów, całkowity rozmiar).

Oto poprawna odpowiedź przy użyciu AWS CLI:

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

Total Objects: 194273

Zobacz dokumentację


4
To jest świetne: Total Objects: 7235 Total Size: 475566411749- takie proste.
— bonh

16
Nadal ma główny narzut związany z wyświetlaniem tysięcy obiektów, niestety (obecnie ponad 600 000, więc jest to dość czasochłonne)
— MichaelChirico

ile będzie kosztować uruchomienie tego zadania na zasobniku z 5 milionami obiektów?
— Psychozoic

2
Ta odpowiedź jest wyjątkowo nieefektywna, potencjalnie bardzo powolna i kosztowna. Aby znaleźć odpowiedź, dokonuje iteracji w całym segmencie.
— tkacz

2
Dodam, że iteracja ponad 1,2 miliarda obiektów przechowywanych w standardowym magazynie może kosztować około 6000 dolarów.
— C Johnson

66

Chociaż jest to stare pytanie, a opinie otrzymano w 2015 r., Obecnie jest to znacznie prostsze, ponieważ konsola internetowa S3 ma włączoną opcję „Pobierz rozmiar”:

wprowadź opis obrazu tutaj

Który zapewnia:

wprowadź opis obrazu tutaj


1
Tak, nowa konsola AWS, choć boli mnie w oczy, umożliwia obliczenie liczby obiektów i całkowitego rozmiaru za jednym kliknięciem przycisku.
— Ani,

11
Wydaje się, że działa to tylko na poziomie folderu. Funkcja „Pobierz rozmiar” nie jest dostępna na poziomie łyżki
— G-.

1
@SOL-. Co się stanie, jeśli wybierzesz wszystkie foldery zasobnika?
— gvasquez,

4
@SOL-. Jednak pole „wybierz wszystko” wybiera tylko foldery i obiekty, które są wyświetlane na stronie, a nie wszystkie foldery / obiekty zasobnika.
— gparis

2
@gparis dobra uwaga. Warto zauważyć. Dzięki. Wygląda więc na to, że w konsoli nie mamy opcji, jeśli jest więcej plików lub folderów, niż można wyświetlić na jednej stronie
— G-.

50

Jeśli używasz narzędzia wiersza poleceń s3cmd , możesz uzyskać rekurencyjną listę określonego zasobnika, wyprowadzając ją do pliku tekstowego.

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

Następnie w Linuksie możesz uruchomić wc -l na pliku, aby policzyć linie (1 linia na obiekt).

wc -l listing.txt

-rW poleceniu jest --recursive, więc powinien działać dla podfolderów, jak również.
— Deepak Joy

3 uwagi na ten temat. a.) powinieneś używać aws s3 lszamiast s3cmd, ponieważ jest szybszy. b.) W przypadku dużych łyżek może to zająć dużo czasu. Zajęło około 5 minut na 1 miliony plików. c.) Zobacz moją odpowiedź poniżej na temat korzystania z chmury.
— mastaBlasta

46

Istnieje teraz proste rozwiązanie z interfejsem API S3 (dostępne w kliencie AWS):

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

lub dla konkretnego folderu:

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

1
Raphael, twoje zapytanie do folderu działa świetnie, z wyjątkiem sytuacji, gdy folder jest pusty lub nie istnieje, wtedy otrzymujesz: W funkcji length (), nieprawidłowy typ wartości: Brak, oczekiwany jeden z: ['string', 'array' , 'obiekt'], otrzymano: "null" Czy istnieje sposób, aby wyprowadzić 0, jeśli folder jest pusty lub nie wychodzi?
— user3591836

1
Otrzymuję Illegal token value '(Contents[])]' (wersja 1.2.9 aws-cli), gdy tylko używam --bucket my-bucketi A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existkiedy używam --bucket s3://my-bucket. (Zdecydowanie istnieje i ma ponad 1000 plików.)
— Darren Cook

@DarrenCook usuwa s3: // z nazwy zasobnika. Wydaje się, że klient nie obsługuje protokołu.
— Sriranjan Manjunath

Jest to znacznie szybsze niż przykłady wc -l. Z moimi wiaderkami liczyłby około 3-4 tys. Obiektów / sek. Więc ~ 5 minut na milion obiektów. Funkcja „Get Size” w interfejsie WWW S3 prawdopodobnie używa czegoś podobnego pod maską, ponieważ zajmuje mniej więcej tyle samo czasu.
— notpeter

Dla BARDZO dużych wiader było to jedyne rozwiązanie, które działało dla mnie w rozsądnym czasie od (mniej niż 20 minut)
— Nick Sarafa

40

Możesz użyć wskaźników AWS Cloudwatch dla s3, aby zobaczyć dokładną liczbę dla każdego segmentu. dane dotyczące chmury po wybraniu zasobnika


Myślę, że to najlepsza odpowiedź
— Oktav

Jedyna prawdziwa odpowiedź, bez robienia czegoś absurdalnego, jak wyświetlenie 1m + kluczy. Zapomniałem, że tam jest.
— Andrew Backer

To wymaga więcej głosów pozytywnych. Każde inne rozwiązanie jest słabo skalowalne pod względem kosztów i czasu.
— Aaron R.

5

Przejdź do AWS Billing, następnie raporty, a następnie AWS Usage reports. Wybierz Amazon Simple Storage Service, a następnie Operation StandardStorage. Następnie możesz pobrać plik CSV zawierający UsageType o wartości StorageObjectCount, który zawiera liczbę elementów dla każdego segmentu.


4

Możesz łatwo uzyskać łączną liczbę i historię, przechodząc do zakładki "Zarządzanie" konsoli s3, a następnie klikając "Metryki" ... Zrzut ekranu zakładki


czy możesz zaktualizować zdjęcie, aby pokazać NumberOfObjects (count/day)wykres? Byłoby lepiej, ponieważ jest to bezpośrednio związane z pytaniem. Na zrzucie ekranu pokazujesz, BucketSizeBytes (bytes/day)które, choć przydatne, nie są bezpośrednio związane z problemem.
— guzmonne

1
Od 2019 roku powinna to być akceptowana odpowiedź. Cała reszta jest przestarzała lub powolna.
— C Johnson

2

Interfejs API zwróci listę w przyrostach co 1000. Sprawdź właściwość IsTruncated, aby zobaczyć, czy jest ich jeszcze więcej. Jeśli tak, musisz wykonać kolejne połączenie i przekazać ostatni otrzymany klucz jako właściwość Marker podczas następnego połączenia. Następnie kontynuowałbyś pętlę w ten sposób, aż IsTruncated ma wartość false.

Zobacz ten dokument Amazon, aby uzyskać więcej informacji: Iteracja wyników wielostronicowych


2

Stary wątek, ale nadal aktualny, ponieważ szukałem odpowiedzi, dopóki tego nie zrozumiałem. Chciałem policzyć pliki przy użyciu narzędzia opartego na GUI (tj. Bez kodu). Tak się składa, że ​​używam już narzędzia o nazwie 3Hub do przenoszenia danych metodą przeciągnij i upuść do iz S3. Chciałem wiedzieć, ile plików mam w konkretnym segmencie (nie sądzę, że rozliczenie rozkłada to na segmenty).

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  

Miałem 20521 plików w zasobniku i policzyłem pliki w mniej niż minutę.


2

Użyłem skryptu w języku Python ze strony scalablelogic.com (dodając rejestrację liczby). Działało świetnie.

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

Pamiętaj, że to nie działa z boto3. Poniżej przedstawiam sugestię jako inną odpowiedź.
— fuzzygroup

2

W s3cmd po prostu uruchom następujące polecenie (w systemie Ubuntu):

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

13
Dlaczego wskrzesiłeś pytanie sprzed 5 lat, aby opublikować źle sformatowaną kopię istniejącej odpowiedzi ?
— Two-Bit Alchemist

Poprzednia odpowiedź niepotrzebnie przesyłała dane wyjściowe do pliku txt.
— mjsa

10
IMO to powinien być komentarz do tej odpowiedzi. To naprawdę trywialna różnica.
— Two-Bit Alchemist

2
Wydaje się, że warto odpowiedzieć - zwłaszcza, że ​​wybrana odpowiedź na to pytanie zaczyna się od „Nie ma mowy ...”, a @mjsa udzielił odpowiedzi w jednym wierszu.
— Nan,

To nie jest dobra odpowiedź, ponieważ nie uwzględnia wersjonowanych obiektów.
— 3h4x

2

Jeśli używasz interfejsu wiersza polecenia AWS w systemie Windows, możesz użyć programu Measure-ObjectPowerShell, aby uzyskać całkowitą liczbę plików, tak jak wc -lw * nix.

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

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

Mam nadzieję, że to pomoże.


2

Jednym z najprostszych sposobów zliczania liczby obiektów w s3 jest:

Krok 1: Wybierz folder główny Krok 2: Kliknij Akcje -> Usuń (oczywiście uważaj, nie usuwaj go) Krok 3: Poczekaj kilka minut, a pokaże Ci liczbę obiektów i ich całkowity rozmiar.

Głosuj w górę, jeśli znajdziesz rozwiązanie.


1

Żaden z interfejsów API nie da ci liczby, ponieważ tak naprawdę nie ma żadnego interfejsu API Amazon, który mógłby to zrobić. Musisz po prostu uruchomić zawartość listy i policzyć liczbę wyników, które zostaną zwrócone.


Z jakiegoś powodu biblioteki ruby ​​(right_aws / appoxy_aws) nie będą wyświetlać więcej niż pierwszych 1000 obiektów w zasobniku. Czy są inne, które będą zawierać listę wszystkich obiektów?
— pola

Kiedy zażądasz listy, udostępnią pole „NextToken”, którego możesz użyć do ponownego wysłania żądania z tokenem, a będzie ono zawierać więcej.
— Mitch Dempsey

1

Z wiersza poleceń w AWS CLI użyj ls plus --summarize. To da ci listę wszystkich twoich przedmiotów i całkowitą liczbę dokumentów w określonym segmencie. Nie próbowałem tego z zasobnikami zawierającymi zasobniki podrzędne:

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

Zajmuje to trochę czasu (wymienienie moich dokumentów 16 + K zajęło około 4 minut), ale jest szybsze niż liczenie 1K na raz.



0

3Hub zostaje wycofane. Jest lepsze rozwiązanie, możesz użyć Transmit (tylko Mac), a następnie po prostu podłączasz się do swojego wiadra i wybierasz Show Item Countz Viewmenu.


Transmisja niestety pokazuje tylko do 1000 elementów (a zatem liczba przedmiotów jest również maksymalna na 1000)
— Tino

0

Możesz pobrać i zainstalować przeglądarkę s3 ze strony http://s3browser.com/ . Po wybraniu zasobnika w prawym środkowym rogu możesz zobaczyć liczbę plików w zasobniku. Ale rozmiar, który pokazuje, jest nieprawidłowy w bieżącej wersji.

Gubs


0

Najłatwiej jest użyć konsoli programisty, na przykład jeśli korzystasz z Chrome, wybierz Narzędzia programistyczne i możesz zobaczyć następujące, możesz albo znaleźć i policzyć lub wykonać jakieś dopasowanie, na przykład 280-279 + 1 = 2

...


Czy mógłbyś dodać więcej szczegółów na temat wykorzystania narzędzi programistycznych do obliczenia całkowitej liczby obiektów w zasobniku.
— Jugal Panchal

0

Możesz potencjalnie użyć spisu Amazon S3, który da ci listę obiektów w pliku csv




0

Możesz po prostu wykonać to polecenie cli, aby uzyskać całkowitą liczbę plików w zasobniku lub określonym folderze

Skanuj całe wiadro

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

możesz użyć tego polecenia, aby uzyskać szczegółowe informacje

aws s3api list-objects-v2 --bucket BUCKET_NAME

Przeskanuj określony folder

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

Jeśli szukasz określonych plików, powiedzmy .jpgobrazów, możesz wykonać następujące czynności:

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

0

Poniżej opisano, jak możesz to zrobić za pomocą klienta 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

Oto wersja boto3 skryptu Pythona osadzona powyżej.

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: // nazwa-zasobnika / prefiks-folderu-jeśli-jakiekolwiek --recursive | wc -l


Działa dla ponad 1000, a dla mnie liczyło 4258
— KingAndrew

Linie nie odpowiadają bezpośrednio liczbie plików. Ponieważ mają również całą linię tylko dla daty i katalogu.
— CMCDragonkai

Polecenie działa dla ograniczonej liczby plików. W moim przypadku liczba plików przekracza milion i nigdy nie daje żadnego wyniku. Ale to dobra opcja w przypadku ograniczonych plików.
— Jugal Panchal
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.