Bagaimana saya bisa tahu berapa banyak objek yang saya simpan di ember S3?


155

Kecuali jika saya melewatkan sesuatu, sepertinya tidak ada API yang saya lihat yang akan memberi tahu Anda berapa banyak objek dalam bucket / folder S3 (awalan). Apakah ada cara untuk mendapat hitungan?


Pertanyaan ini mungkin bermanfaat: stackoverflow.com/questions/701545/…
Brendan Long

1
Solusi memang ada sekarang di 2015: stackoverflow.com/a/32908591/578989
Mayank Jaiswal

Lihat jawaban saya di bawah ini: stackoverflow.com/a/39111698/996926
advncd

Jawaban:


40

Tidak mungkin, kecuali Anda

  1. daftar semuanya dalam batch 1000 (yang bisa lambat dan menyedot bandwidth - amazon sepertinya tidak pernah mengompres respons XML), atau

  2. masuk ke akun Anda di S3, dan buka Akun - Penggunaan. Tampaknya dept penagihan tahu persis berapa banyak objek yang telah Anda simpan!

Cukup mengunduh daftar semua objek Anda sebenarnya akan memakan waktu dan biaya sejumlah uang jika Anda menyimpan 50 juta objek.

Lihat juga utas ini tentang StorageObjectCount - yang ada di data penggunaan.

S3 API untuk mendapatkan setidaknya dasar-dasarnya, bahkan jika itu sudah jam, akan lebih bagus.


Omong-omong, tautan itu sudah mati.
bidang


Jika Anda malas seperti saya, Newvem pada dasarnya melakukan ini atas nama Anda dan mengumpulkan / melacak hasilnya pada tingkat per ember di seluruh akun S3 Anda.
rcoup

2
Bisakah Anda memperbarui respons Anda untuk memasukkan tanggapan @ MayankJaiswal?
Joseph Casey

1
dept penagihan tahu semua! tidak heran mereka memiliki kekuatan untuk menjatuhkan s3 pantai timur secara tidak sengaja
ski_squaw

256

Menggunakan AWS CLI

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

atau

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

Catatan: Perintah cloudwatch di atas tampaknya berfungsi untuk beberapa sementara tidak untuk yang lain. Dibahas di sini: https://forums.aws.amazon.com/thread.jspa?threadID=217050

Menggunakan AWS Web Console

Anda dapat melihat bagian metrik cloudwatch untuk mendapatkan kira-kira jumlah objek yang disimpan. masukkan deskripsi gambar di sini

Saya memiliki sekitar 50 Juta produk dan butuh lebih dari satu jam untuk dihitung menggunakan aws s3 ls


18
Ini harus lebih dekat ke atas.
Joseph Casey

3
@ JosephMCasey saya setuju. Ini juga berfungsi untuk memberikan jumlah objek dalam direktori dengan ember seperti ini:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
tim peterson

1
Memberikan kesalahan ini ketika saya menjalankan perintah cmd di atas - 'wc' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dijalankan atau file batch. - Saya cukup baru dalam hal ini sehingga dapatkah seseorang memberikan solusi?
Sandun

Peringatan bahwa CloudWatch sepertinya tidak terlalu bisa diandalkan. Saya memiliki file mp4 dalam satu ember yang CloudWatch (NumberOfObjects metric) dihitung sebagai 2.300 objek terpisah. Saya mendapat nomor yang benar dengan AWS CLI.
AlexK

Kenapa "Sedang"? Apakah seseorang tidak mau "Jumlah" saja?
ffxsam

150

Ada --summarizesaklar yang menyertakan informasi ringkasan ember (yaitu jumlah objek, ukuran total).

Inilah jawaban yang benar menggunakan AWS cli:

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

Total Objects: 194273

Lihat dokumentasi


4
Ini bagus: Total Objects: 7235 Total Size: 475566411749- sangat mudah.
bonh

16
Sayangnya, masih ada overhead yang besar dalam mendaftarkan ribuan objek, (saat ini lebih dari 600.000, jadi ini cukup memakan waktu)
MichaelChirico

berapa biaya untuk menjalankan tugas ini pada bucket dengan objek 5M?
Psychozoic

2
Jawaban ini sangat tidak efisien, berpotensi sangat lambat dan mahal. Itu beralih ke seluruh ember untuk menemukan jawabannya.
penenun

2
Dan bolehkah saya menambahkan, bahwa mengulang lebih dari 1,2 miliar objek yang disimpan dalam penyimpanan standar, biayanya sekitar $ 6000 dolar.
C Johnson

66

Meskipun ini adalah pertanyaan lama, dan umpan balik diberikan pada tahun 2015, sekarang ini lebih sederhana, karena S3 Web Console telah mengaktifkan opsi "Dapatkan Ukuran":

masukkan deskripsi gambar di sini

Yang menyediakan berikut ini:

masukkan deskripsi gambar di sini


1
Ya, Konsol AWS yang baru, meskipun menyakitkan bagi saya, membuat penghitungan jumlah Objek dan ukuran total tersedia dengan satu klik tombol.
Ani

11
Tampaknya ini hanya berfungsi pada level folder. "Dapatkan ukuran" tidak tersedia di level bucket
G-.

1
@ G-. Bagaimana jika Anda memilih semua folder bucket?
gvasquez

4
@ G-. Namun, kotak "pilih semua" hanya memilih folder dan objek yang ditampilkan di halaman, tidak semua folder / objek ember.
gparis

2
@ Poin yang bagus. Perlu diperhatikan. Terima kasih. Jadi sepertinya di konsol, kami tidak memiliki opsi jika ada lebih banyak file atau folder daripada yang dapat ditampilkan pada satu halaman
G-.

50

Jika Anda menggunakan alat baris perintah s3cmd , Anda bisa mendapatkan daftar rekursif dari ember tertentu, mengeluarkannya ke file teks.

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

Kemudian di linux Anda dapat menjalankan wc -l pada file untuk menghitung baris (1 baris per objek).

wc -l listing.txt

Perintah -rin adalah untuk --recursive, jadi itu juga bisa digunakan untuk sub-folder.
Deepak Joy

3 catatan tentang ini. a.) Anda harus menggunakan aws s3 lsdaripada s3cmd karena lebih cepat. b.) Untuk ember besar perlu waktu lama. Butuh waktu sekitar 5 menit untuk file 1mil. c.) Lihat jawaban saya di bawah ini tentang menggunakan cloudwatch.
mastaBlasta

46

Ada solusi mudah dengan API S3 sekarang (tersedia di AWS CLI):

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

atau untuk folder tertentu:

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

1
Raphael, permintaan folder Anda berfungsi dengan baik, kecuali ketika folder kosong atau tidak ada, maka Anda mendapatkan: Dalam panjang fungsi (), jenis nilai tidak valid: Tidak ada, yang diharapkan dari: ['string', 'array' , 'object'], diterima: "null" Apakah ada cara untuk membuatnya menghasilkan 0 jika folder kosong atau tidak keluar?
user3591836

1
Saya mendapatkan Illegal token value '(Contents[])]' (versi 1.2.9 dari aws-cli), saat hanya menggunakan --bucket my-bucketdan A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existketika menggunakan --bucket s3://my-bucket. (Pasti ada, dan memiliki 1000+ file.)
Darren Cook

@ DarrenCook hapus s3: // dari nama bucket. Klien sepertinya tidak mendukung protokol.
Sriranjan Manjunath

Ini jauh lebih cepat daripada contoh-contoh wc -l. Dengan ember saya akan menghitung sekitar 3-4k benda / detik. Jadi ~ 5 menit per juta objek. "Dapatkan Ukuran" di GUI web S3 kemungkinan menggunakan sesuatu yang serupa di bawah tenda karena membutuhkan waktu yang hampir bersamaan.
notpeter

Untuk SANGAT ember besar, ini adalah satu-satunya solusi yang bekerja untuk saya dalam waktu yang wajar mulai (kurang dari 20 menit)
Nick Sarafa

40

Anda dapat menggunakan metrik jam tangan AWS untuk s3 untuk melihat jumlah pasti untuk setiap kotak. metrik cloudwatch saat Anda memilih bucket


Saya pikir ini adalah jawaban terbaik
Oktav

Satu-satunya jawaban nyata, tanpa melakukan sesuatu yang konyol seperti mendaftar kunci 1m +. Saya lupa itu ada di sana.
Andrew Backer

Ini membutuhkan lebih banyak upvotes. Setiap solusi lain memiliki skala yang buruk dalam hal biaya dan waktu.
Aaron R.

5

Buka Penagihan AWS, lalu laporkan, lalu laporan Penggunaan AWS. Pilih Amazon Simple Storage Service, lalu Operation StandardStorage. Kemudian Anda dapat mengunduh file CSV yang menyertakan UsageType of StorageObjectCount yang mencantumkan jumlah item untuk setiap ember.


4

Anda dapat dengan mudah mendapatkan jumlah total dan riwayat jika Anda pergi ke konsol "Manajemen" tab s3 dan kemudian klik pada "Metrik" ... Cuplikan layar tab


dapatkah Anda memperbarui gambar untuk menampilkan NumberOfObjects (count/day)grafik? Akan lebih baik karena terkait langsung dengan pertanyaan. Di tangkapan layar, Anda menunjukkan BucketSizeBytes (bytes/day)yang, meskipun bermanfaat, tidak terkait langsung dengan masalah tersebut.
guzmonne

1
Pada 2019, ini sekarang harus menjadi jawaban yang diterima. Semua yang lain sudah usang atau lambat.
C Johnson

2

Api akan mengembalikan daftar dalam peningkatan 1000. Periksa properti IsTruncated untuk melihat apakah masih ada lagi. Jika ada, Anda perlu melakukan panggilan lain dan meneruskan kunci terakhir yang Anda dapatkan sebagai properti Marker pada panggilan berikutnya. Anda kemudian akan terus loop seperti ini sampai IsTruncated salah.

Lihat dokumen Amazon ini untuk info lebih lanjut: Iterasi Melalui Hasil Multi-Halaman


2

Utas lama, tetapi masih relevan ketika saya mencari jawabannya sampai saya baru menemukan jawabannya. Saya ingin jumlah file menggunakan alat berbasis GUI (yaitu tidak ada kode). Saya kebetulan sudah menggunakan alat yang disebut 3Hub untuk drag & drop transfer ke dan dari S3. Saya ingin tahu berapa banyak file yang saya miliki di ember tertentu (saya pikir penagihan tidak dapat dirobohkan dengan ember).

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  

Saya memiliki 20521 file di ember dan menghitung file dalam waktu kurang dari satu menit.


2

Saya menggunakan skrip python dari scalablelogic.com (menambahkan dalam penghitungan logging). Bekerja dengan baik.

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

Hanya agar Anda sadar, ini tidak bekerja dengan boto3. Saya menyumbangkan saran di bawah ini sebagai jawaban yang berbeda.
fuzzygroup

2

Di s3cmd, jalankan saja perintah berikut (pada sistem Ubuntu):

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

13
Mengapa Anda menghidupkan kembali pertanyaan berusia 5 tahun untuk mengirim salinan yang sudah diformat dengan buruk dari jawaban yang ada ?
Alchemist Dua-Bit

Jawaban sebelumnya menyalurkan output ke file txt jika tidak perlu.
mjsa

10
IMO ini seharusnya menjadi komentar atas jawaban itu. Ini adalah perbedaan yang sangat sepele.
Alchemist Dua-Bit

2
Tampaknya seperti jawaban yang layak - terutama karena jawaban yang dipilih untuk pertanyaan ini dimulai dengan 'Tidak ada cara ...' dan @mjsa telah memberikan jawaban satu baris.
Nan

Ini bukan jawaban yang baik karena tidak memperhitungkan objek berversi akun.
3h4x

2

Jika Anda menggunakan AWS CLI pada Windows, Anda dapat menggunakan Measure-Objectdari PowerShell untuk mendapatkan jumlah total file, seperti wc -lpada * nix.

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

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

Semoga ini bisa membantu.


2

Salah satu cara paling sederhana untuk menghitung jumlah objek di s3 adalah:

Langkah1: Pilih folder root Langkah2: Klik Tindakan -> Hapus (Jelas, berhati-hatilah jangan menghapusnya) Langkah3: Tunggu beberapa menit saja akan menunjukkan jumlah objek dan ukuran totalnya.

UpVote jika Anda menemukan solusinya.


1

Tak satu pun dari API akan memberi Anda hitungan karena sebenarnya tidak ada API khusus Amazon untuk melakukan itu. Anda hanya perlu menjalankan daftar-isi dan menghitung jumlah hasil yang dikembalikan.


Untuk beberapa alasan, lib ruby ​​(right_aws / appoxy_aws) tidak akan mencantumkan lebih dari 1000 objek pertama dalam sebuah ember. Apakah ada orang lain yang akan mendaftar semua benda?
bidang

Saat Anda meminta daftar, mereka menyediakan bidang "NextToken", yang dapat Anda gunakan untuk mengirim permintaan lagi dengan token, dan itu akan mencantumkan lebih banyak.
Mitch Dempsey

1

Dari baris perintah di AWS CLI, gunakan ls plus --summarize. Ini akan memberi Anda daftar semua item Anda dan jumlah total dokumen dalam ember tertentu. Saya belum mencoba ini dengan ember yang berisi sub-ember:

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

Butuh agak lama (butuh daftar 16 + K dokumen saya sekitar 4 menit), tapi lebih cepat daripada menghitung 1K pada suatu waktu.



0

3Hub dihentikan. Ada solusi yang lebih baik, Anda dapat menggunakan Transmit (hanya Mac), kemudian Anda cukup menyambungkan ke ember Anda dan memilih Show Item Countdari Viewmenu.


Sayangnya pengiriman hanya menunjukkan hingga 1000 item (dan karena itu Hitungan Item juga maksimal 1000)
Tino

0

Anda dapat mengunduh dan menginstal browser s3 dari http://s3browser.com/ . Ketika Anda memilih sebuah ember di sudut kanan tengah, Anda dapat melihat jumlah file di dalam ember. Tapi, ukuran yang ditunjukkannya salah dalam versi saat ini.

Gubs


0

Cara termudah adalah dengan menggunakan konsol pengembang, misalnya, jika Anda menggunakan chrome, pilih Tools Developer, dan Anda dapat melihat yang berikut, Anda dapat menemukan dan menghitung atau melakukan kecocokan, seperti 280-279 + 1 = 2

...


Bisakah Anda menambahkan beberapa detail lebih lanjut tentang bagaimana Anda telah menggunakan alat pengembang untuk mencari tahu jumlah objek dalam sebuah ember.
Jugal Panchal

0

Anda dapat berpotensi menggunakan inventaris Amazon S3 yang akan memberi Anda daftar objek dalam file csv




0

Anda bisa menjalankan perintah cli ini untuk mendapatkan jumlah total file dalam bucket atau folder tertentu

Pindai seluruh ember

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

Anda dapat menggunakan perintah ini untuk mendapatkan detail

aws s3api list-objects-v2 --bucket BUCKET_NAME

Pindai folder tertentu

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

Jika Anda mencari file tertentu, katakanlah .jpggambar, Anda dapat melakukan hal berikut:

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

0

Berikut ini adalah bagaimana Anda dapat melakukannya dengan menggunakan klien 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

Berikut versi boto3 dari skrip python yang tertanam di atas.

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


Itu bekerja untuk lebih dari 1000 itu menghitung 4258 untuk saya
KingAndrew

Garis tidak secara langsung berhubungan dengan jumlah file. Karena mereka juga memiliki seluruh baris hanya untuk tanggal dan direktori.
CMCDragonkai

Perintah ini berfungsi untuk sejumlah file. Dalam kasus saya, jumlah file lebih dari satu juta dan tidak pernah memberikan hasil apa pun. Tetapi ini adalah opsi yang baik untuk file terbatas.
Jugal Panchal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.