Pertanyaan Bagaimana saya bisa mendapatkan ukuran bucket Amazon S3?


Saya ingin membuat grafik ukuran (dalam byte, dan # item) dari sebuah bucket Amazon S3 dan mencari cara yang efisien untuk mendapatkan datanya.

Itu s3cmd alat menyediakan cara untuk mendapatkan ukuran file total menggunakan s3cmd du s3://bucket_name, tapi saya khawatir tentang kemampuannya untuk menskalakan karena terlihat seperti mengambil data tentang setiap file dan menghitung jumlahnya sendiri. Karena Amazon membebani pengguna dalam GB-Bulan, tampaknya aneh bahwa mereka tidak mengekspos nilai ini secara langsung.

Meskipun API REST Amazon mengembalikan jumlah barang dalam ember, s3cmd tampaknya tidak membeberkannya. Saya bisa melakukannya s3cmd ls -r s3://bucket_name | wc -l tapi itu seperti peretasan.

The Ruby AWS :: S3 perpustakaan tampak menjanjikan, tetapi hanya menyediakan # item bucket, bukan ukuran bucket total.

Adakah yang mengetahui alat atau pustaka baris perintah lain (lebih suka Perl, PHP, Python, atau Ruby) yang menyediakan cara untuk mendapatkan data ini?


248
2017-11-15 00:40




Saya menulis alat untuk menganalisis ukuran keranjang: github.com/EverythingMe/ncdu-s3 - omribahumi
Saya heran bahwa Amazon mengenakan biaya untuk ruang, tetapi tidak memberikan ukuran total yang diambil oleh bucket S3 hanya melalui panel S3. - Luke
Bagi saya sebagian besar jawaban di bawah ini mengambil waktu yang cukup lama untuk mengambil ukuran keranjang, namun skrip python ini jauh lebih cepat daripada sebagian besar jawaban - slsmk.com/getting-the-size-of-an-s3-bucket-using-boto3-for-aws - Vaulstein


Jawaban:


AWS CLI sekarang mendukung --query parameter yang membutuhkan JMESPath ekspresi.

Ini berarti Anda dapat menjumlahkan nilai ukuran yang diberikan oleh list-objects menggunakan sum(Contents[].Size) dan menghitung seperti length(Contents[]).

Ini dapat dijalankan menggunakan CLI AWS resmi seperti di bawah ini dan diperkenalkan di Februari 2014

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

146
2017-11-16 23:00



Untuk bucket besar (#file besar), ini luar biasa lambat. Utilitas Python s4cmd "du" sangat cepat: s4cmd du s3://bucket-name - Brent Faust
Itu aneh. Apa profil keseluruhan bucket Anda (dangkal dan gemuk / dalam dan tipis)? Sepertinya s3cmd harus memiliki overhead yang sama seperti AWS CLI. Dalam kode yang ditunjukkannya  s3cmd buat permintaan untuk setiap direktori dalam keranjang. - Christopher Hackett
untuk mendapatkannya dalam format yang dapat dibaca manusia: 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
Sekarang, AWS Cloudwatch menawarkan metrik per-keranjang "BucketSizeBytes" ini bukan lagi solusi yang tepat. Lihat jawaban Toukakoukan di bawah ini. - cce
s4cmd du luar biasa, terima kasih @Brent Faust! catatan kecil (bagi yang peduli) yang perlu Anda tambahkan -r untuk mendapatkan ukuran sub-direktori juga. - Greg Sadetsky


Ini sekarang dapat dilakukan secara sepele hanya dengan klien baris perintah AWS resmi:

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

Dokumentasi resmi

Ini juga menerima awalan jalur jika Anda tidak ingin menghitung seluruh bucket:

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

254
2017-09-09 14:04



Ini adalah jawaban terbaik dan terbaru - Tim
Setuju, ini adalah jawaban terbaik. - Luis Artola
Ini sangat lambat untuk bucket dengan banyak file karena pada dasarnya mencantumkan semua objek dalam bucket sebelum menunjukkan ringkasannya, dan dalam hal itu tidak lebih cepat daripada jawaban @Christopher Hackett - kecuali yang satu ini jauh lebih berisik. - Guss
Jalankan pada instance EC2 dengan wilayah bucket yang sama untuk meningkatkan latensi - juanmirocks
Jika Anda hanya tertarik pada ukuran ringkasan, ini adalah solusi tercepat dan terbaru dan Anda dapat dengan mudah menyalurkan melalui ekor untuk menemukan nilai itu. - Charlie Hileman


Konsol AWS:

Seperti 28 Juli 2015 Anda bisa mendapatkan informasi ini melalui CloudWatch. Jika Anda menginginkan GUI, pergilah ke Konsol CloudWatch: (Pilih Wilayah>) Metrik> S3

Perintah AWS CLI:

Ini jauh lebih cepat daripada beberapa perintah lain yang diposting di sini, karena tidak menanyakan ukuran setiap file secara individual untuk menghitung jumlah.

 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

Penting: Anda harus menentukan StorageType dan BucketName dalam argumen dimensi jika tidak, Anda tidak akan mendapatkan hasil. Yang perlu Anda ubah adalah --start-date, --end-time, dan Value=toukakoukan.com.


Berikut ini skrip bash yang dapat Anda gunakan untuk menghindari keharusan menentukan --start-date dan --end-time secara manual.

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

104
2017-07-31 21:58



Atau dalam konsol CloudWatch: (Pilih Wilayah>) Metrik> S3 - Halil Özgür
Ini adalah solusi termudah dan tercepat. Sayangnya jawabannya masih hanya di tempat keempat. - luk2302
Ini bekerja untuk keranjang saya dengan 10 juta + benda. Tapi skrip bash tidak mengembalikan apa-apa, harus pergi ke GUI). - Petah
Perlu juga dicatat bahwa Anda harus mengubah wilayah ini juga - majikman
Mei 2018: kesalahan skrip dengan Invalid value ('1525354418') for param timestamp:StartTime of type timestamp - anneb


s3cmd dapat melakukan ini:

s3cmd du s3://bucket-name


103
2017-07-08 13:40



Terima kasih. Ini beberapa waktu. Pada bucket yang menyimpan file sistem deduplicic s3ql dengan sekitar satu juta file menggunakan sekitar 33 GB data yang tidak terisi, dan sekitar 93000 s3 objek, s3cmd du membutuhkan waktu sekitar 4 menit untuk menghitung jawaban. Saya ingin tahu bagaimana membandingkan dengan pendekatan lain seperti php yang dijelaskan di sini. - nealmcb
Ini lambat karena Panggilan API S3 ListObjects mengembalikan objek di halaman 1000 objek. Karena I / O sejauh ini merupakan faktor pembatas, saya pikir solusi apa pun akan relatif lambat atas 93.000 objek. - David Snabel-Caunt
s4cmd juga dapat melakukan hal yang sama, dengan manfaat tambahan multi-threading permintaan ke API S3 untuk menghitung hasil lebih cepat. Alat ini belum diperbarui baru-baru ini, tetapi orang yang lewat di Internet dapat menemukannya berguna. - Nick Chammas
s4cmd hanya mengembalikan 0 untuk saya, dan kembali BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format. untuk bucket dengan karakter huruf besar. - Lakitu


Jika Anda mengunduh file laporan penggunaan, Anda dapat membuat grafik nilai harian untuk TimedStorage-ByteHrs bidang.

Jika Anda ingin nomor tersebut di GiB, cukup bagi dengan 1024 * 1024 * 1024 * 24 (Itu GiB-jam untuk siklus 24 jam). Jika Anda ingin nomor dalam byte, cukup bagi dengan 24 dan grafik.


22
2017-12-05 17:22





Menggunakan alat baris perintah AWS s3 resmi:

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

16
2018-04-23 11:22



Berikan tautan ke tempat amazon benar-benar menyatakan ini. Saya tidak dapat menemukannya. - lobi
docs.aws.amazon.com/cli/latest/index.html - dyltini
docs.aws.amazon.com/cli/latest/reference/s3/ls.html adalah tautan yang lebih baik - Ian Bamforth
Jawaban ini bekerja paling baik dan tercepat untuk saya. - Miro
jawaban terbaik dan tercepat! - PlagTag


s4cmd adalah cara tercepat yang saya temukan (utilitas baris perintah yang ditulis dengan Python):

pip install s4cmd

Sekarang untuk menghitung seluruh ukuran bucket menggunakan beberapa utas:

s4cmd du -r s3://bucket-name

10
2018-03-31 22:12



Tidak, s4cmd du s3://123123drink tidak akan hanya mengembalikan ukuran ember. Untuk mendapatkan ukuran ember Anda tambahkan rekursif -r, seperti ini: s4cmd du -r s3: // 123123drink - George Chalhoub
Ya, poin bagus @BukLau (ditambahkan -r contoh di atas untuk menghindari kebingungan ketika orang menggunakan folder simulasi pada S3). - Brent Faust


Saya menggunakan API S3 REST / Curl tercantum sebelumnya di utas ini dan melakukan ini:

<?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
2017-12-12 19:05





Jadi berkeliling melalui API dan memainkan beberapa pertanyaan yang sama, S3 akan menghasilkan seluruh isi bucket dalam satu permintaan dan tidak perlu turun ke direktori. Hasilnya kemudian hanya membutuhkan penjumlahan melalui berbagai elemen XML, dan bukan panggilan berulang. Saya tidak memiliki keranjang sampel yang memiliki ribuan item sehingga saya tidak tahu seberapa baik ukurannya, tetapi tampaknya cukup sederhana.


4
2017-11-15 04:00



Ini sepertinya merupakan pilihan terbaik. Akan memperbarui posting ini di masa depan jika skalanya buruk dan saya perlu melakukan sesuatu yang lain. Perpustakaan yang akhirnya menyediakan akses mudah ke hasil API mentah adalah PHP ini: undesigned.org.za/2007/10/22/amazon-s3-php-class - Garret Heaton
Bukankah itu hanya terbatas pada 1000 item pertama? - Charlie Schliesser


... Agak terlambat tapi, cara terbaik yang saya temukan adalah dengan menggunakan laporan di portal AWS. Saya membuat kelas PHP untuk mengunduh dan mengurai laporan. Dengan itu Anda bisa mendapatkan jumlah objek total untuk setiap keranjang, ukuran total dalam GB atau jam byte dan banyak lagi.

Lihat dan beri tahu saya jika bermanfaat

AmazonTools


4
2017-12-20 22:56



Ini adalah solusi yang menarik, meski sedikit bersifat hackish. Khawatir tentang itu melanggar jika / ketika Amazon mengubah situs mereka, tetapi saya mungkin harus mencoba ini setelah saya memiliki cukup objek yang cara lain menjadi terlalu lambat. Manfaat lain dari pendekatan ini adalah Anda tidak dikenai biaya untuk panggilan API apa pun. - Garret Heaton
. . . ini adalah asumsi tetapi, jika Amazon mengubah tampilan situs mereka, saya ragu mereka akan banyak mengubah bagian belakang, yang berarti permintaan GET dan POST saat ini seharusnya bekerja. Saya akan mempertahankan kelas jika acara itu gagal karena saya sering menggunakannya.


Anda dapat menggunakan utilitas s3cmd, misalnya:

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

4
2018-03-09 15:43