Bagaimana saya bisa mendapatkan ukuran ember Amazon S3?

289

Saya ingin membuat grafik ukuran (dalam byte, dan # item) dari ember Amazon S3 dan saya sedang mencari cara yang efisien untuk mendapatkan data.

Alat s3cmd menyediakan cara untuk mendapatkan ukuran file total menggunakan s3cmd du s3://bucket_name, tapi saya khawatir tentang kemampuannya untuk skala karena sepertinya mengambil data tentang setiap file dan menghitung jumlah sendiri. Karena Amazon menagih pengguna dalam GB-Bulan, rasanya aneh bahwa mereka tidak mengekspos nilai ini secara langsung.

Meskipun REST API Amazon mengembalikan jumlah item dalam ember, s3cmd tampaknya tidak mengeksposnya. Saya bisa melakukannya s3cmd ls -r s3://bucket_name | wc -ltetapi itu seperti retasan.

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

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

Garret Heaton
sumber
Saya menulis alat untuk menganalisis ukuran bucket: github.com/EverythingMe/ncdu-s3
omribahumi
20
Saya heran bahwa Amazon mengenakan biaya untuk ruang, tetapi tidak memberikan ukuran total yang diambil oleh ember S3 hanya melalui panel S3.
Luke
Bagi saya sebagian besar jawaban di bawah ini membutuhkan waktu cukup lama untuk mengambil ukuran bucket, 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:

168

AWS CLI sekarang mendukung --queryparameter yang mengambil ekspresi JMESPath .

Ini berarti Anda dapat menjumlahkan nilai ukuran yang diberikan dengan list-objectsmenggunakan sum(Contents[].Size)dan menghitung suka length(Contents[]).

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

 aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"
Christopher Hackett
sumber
21
Untuk ember besar (#file besar), ini sangat lambat. Utilitas Python s4cmd "du" menyala dengan cepat:s4cmd du s3://bucket-name
Brent Faust
Itu aneh. Apa profil keseluruhan ember Anda (dangkal dan gemuk / dalam dan tipis)? Sepertinya s3cmdharus memiliki biaya overhead yang sama dengan AWS CLI. Dalam kode itu ditampilkan s3cmd membuat permintaan untuk setiap direktori dalam ember.
Christopher Hackett
22
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
21
Sekarang AWS Cloudwatch menawarkan metrik "BucketSizeBytes" per-bucket, ini bukan lagi solusi yang tepat. Lihat jawaban Toukakoukan di bawah ini.
cce
2
s4cmd duluar biasa, terima kasih @Brent Faust! catatan kecil (untuk yang bersangkutan) yang perlu Anda tambahkan -runtuk mendapatkan ukuran sub-direktori juga.
Greg Sadetsky
330

Ini sekarang dapat dilakukan secara sepele hanya dengan klien command line 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 ember:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory
Philwills
sumber
23
Ini adalah jawaban terbaik dan terkini
Tim
2
Setuju, ini jawaban terbaik.
Luis Artola
25
Ini sangat lambat untuk bucket dengan banyak file karena pada dasarnya daftar semua objek di bucket sebelum menampilkan ringkasan, dan karena itu tidak secara signifikan lebih cepat daripada jawaban @Christopher Hackett - kecuali yang ini jauh lebih berisik.
Guss
Jalankan instance EC2 dengan wilayah bucket yang sama untuk meningkatkan latensi
juanmirocks
1
Ini akan menunjukkan ukuran SEMUA file individual di pohon direktori. Bagaimana jika saya hanya ingin ukuran total untuk direktori?
Chris F
130

Konsol AWS:

Pada 28 Juli 2015 Anda bisa mendapatkan informasi ini melalui CloudWatch . Jika Anda menginginkan GUI, buka konsol CloudWatch : (Pilih Wilayah>) Metrik> S3

Perintah AWS CLI:

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

 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. Semua Anda perlu mengubah adalah --start-date, --end-time, dan Value=toukakoukan.com.


Berikut skrip bash yang dapat Anda gunakan untuk menghindari keharusan menentukan --start-datedan --end-timesecara 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
Sam Martin
sumber
25
Atau di konsol CloudWatch : (Pilih Wilayah>) Metrik> S3
Halil Özgür
3
Sejauh ini, ini adalah solusi termudah dan tercepat. Sayangnya jawabannya masih hanya di tempat keempat.
luk2302
Ini berfungsi untuk ember saya dengan objek + 10 juta. Tapi skrip bash tidak mengembalikan apa-apa, harus pergi ke GUI).
Petah
1
Perlu juga dicatat bahwa Anda harus mengubah wilayah juga
majikman
mei 2018: kesalahan skrip denganInvalid value ('1525354418') for param timestamp:StartTime of type timestamp
anneb
106

s3cmd dapat melakukan ini:

s3cmd du s3://bucket-name

Stefan Ticu
sumber
Terima kasih. Inilah beberapa waktu. Pada bucket yang menyimpan sistem file deduplicated s3ql dengan sekitar satu juta file menggunakan sekitar 33 GB data yang tidak diupgrade, dan sekitar 93000 objek s3, du s3cmd membutuhkan waktu sekitar 4 menit untuk menghitung jawabannya. Saya ingin tahu bagaimana membandingkannya dengan pendekatan lain seperti yang dijelaskan di tempat lain di sini.
nealmcb
1
Itu lambat karena panggilan API S3 ListObjects mengembalikan objek di halaman 1000 objek. Karena I / O adalah faktor pembatas, saya pikir solusi apa pun akan relatif lambat pada 93.000 objek.
David Snabel-Caunt
11
s4cmd juga dapat melakukan hal yang sama, dengan manfaat tambahan dari multi-threading permintaan ke API S3 untuk menghitung hasilnya lebih cepat. Alat ini belum diperbarui baru-baru ini, tetapi pelintas Internet mungkin merasa 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 ember dengan karakter huruf besar.
Lakitu
22

Jika Anda mengunduh laporan penggunaan , Anda bisa membuat grafik nilai harian untuk TimedStorage-ByteHrsbidang tersebut.

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

Christopher Schultz
sumber
19

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"}'

Ini adalah perintah yang lebih baik, tambahkan saja 3 parameter berikut --summarize --human-readable --recursivesetelahnya aws s3 ls. --summarizetidak diperlukan meskipun memberikan sentuhan yang bagus pada ukuran total.

aws s3 ls s3://bucket/folder --summarize --human-readable --recursive
dyltini
sumber
1
Berikan tautan ke tempat amazon sebenarnya menyatakan ini. Saya tidak dapat menemukannya.
lobi
1
docs.aws.amazon.com/cli/latest/reference/s3/ls.html adalah tautan yang lebih baik
Ian Bamforth
4
Jawaban ini paling berhasil dan tercepat untuk saya.
Miro
2
jawaban terbaik dan tercepat!
PlagTag
11

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
Brent Faust
sumber
6
Tidak, s4cmd du s3://123123drinktidak akan dengan mudah mengembalikan ukuran ember. Untuk mendapatkan ukuran ember Anda menambahkan rekursif -r, seperti ini: s4cmd du -r s3: // 123123drink
George Chalhoub
1
Ya, poin bagus @BukLau (ditambahkan -rke contoh di atas untuk menghindari kebingungan ketika orang menggunakan folder yang disimulasikan pada S3).
Brent Faust
6

Saya menggunakan S3 REST / Curl API yang terdaftar 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';
?>
Vic
sumber
6

Anda dapat menggunakan utilitas s3cmd, misalnya:

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/
pengguna319660
sumber
5

Jadi, berputar-putar melalui API dan memainkan beberapa pertanyaan yang sama, S3 akan menghasilkan seluruh isi ember dalam satu permintaan dan tidak perlu turun ke direktori. Hasilnya kemudian hanya membutuhkan penjumlahan melalui berbagai elemen XML, dan tidak panggilan berulang. Saya tidak memiliki ember sampel yang memiliki ribuan item, jadi saya tidak tahu seberapa baik skala itu, tetapi tampaknya cukup sederhana.

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

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

Lihatlah dan beri tahu saya apakah itu membantu

AmazonTools


sumber
Ini adalah solusi yang menarik, meski agak retas. Khawatir tentang hal itu pecah jika / ketika Amazon mengubah situs mereka, tetapi saya mungkin harus mencoba ini setelah saya memiliki cukup objek yang sebaliknya menjadi terlalu lambat. Manfaat lain dari pendekatan ini adalah Anda tidak dikenakan biaya untuk panggilan API apa pun.
Garret Heaton
. . . itu sebuah asumsi tetapi, jika Amazon memang mengubah tampilan situs mereka, saya ragu mereka akan banyak mengubah bagian belakang, yang berarti permintaan GET dan POST saat ini harus bekerja. Saya akan mempertahankan kelas jika hal itu benar-benar rusak karena saya sering menggunakannya.
3

Saya sarankan menggunakan Laporan Penggunaan S3 untuk kotak besar , lihat Cara saya tentang cara mendapatkannya. Pada dasarnya Anda perlu mengunduh Laporan Penggunaan untuk layanan S3 untuk hari terakhir dengan Penyimpanan Jangka Waktu - Byte Jam dan parsing untuk mendapatkan penggunaan disk.

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

Dokumentasi AWS memberi tahu Anda cara melakukannya:

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

Ini adalah output yang Anda dapatkan:

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
奉 太郎 折 木
sumber
2

Untuk pendekatan yang benar-benar berteknologi rendah: gunakan klien S3 yang dapat menghitung ukuran untuk Anda. Saya menggunakan Panic's Transmit, klik pada ember, lakukan "Dapatkan Info" dan klik tombol "Hitung". Saya tidak yakin seberapa cepat atau akurat itu dalam kaitannya dengan metode lain, tetapi tampaknya memberikan kembali ukuran yang saya harapkan.

zmippie
sumber
2

Karena ada begitu banyak jawaban, saya pikir saya akan menjawabnya sendiri. Saya menulis implementasi saya di C # menggunakan LINQPad. Salin, tempel, dan masukkan dalam kunci akses, kunci rahasia, titik akhir wilayah, dan nama bucket yang ingin Anda query. Juga, pastikan untuk menambahkan paket nuget AWSSDK.

Pengujian terhadap salah satu ember saya, itu memberi saya hitungan 128075 dan ukuran 70,6GB. Saya tahu itu 99,9999% akurat, jadi saya baik dengan hasilnya.

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
sumber
2

Jika Anda ingin mendapatkan ukuran dari AWS Console:

  1. Pergi ke S3 dan klik pada nama ember
  2. Pilih tab "Manajemen"

masukkan deskripsi gambar di sini

  1. Pilih tab Metrik

Secara default, Anda akan melihat Metrik Penyimpanan ember

Hooman Bahreini
sumber
1

Saya tahu ini adalah pertanyaan yang lebih lama tetapi ini adalah contoh PowerShell:

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

$A berisi ukuran bucket, dan ada parameter keyname jika Anda hanya ingin ukuran folder tertentu dalam bucket.

DCJeff
sumber
Pertama jalankan Get-object..line dan jalankan $ A (untuk mereka yang tidak terbiasa dengan PowerShell)
Faiz
1

Untuk memeriksa semua ukuran bucket, coba skrip bash ini

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
sumber
Ini bekerja dengan baik.
Mike Barlow - BarDev
Menangkap output dalam sebuah variabel agar Anda dapat mengulanginya adalah antipattern yang boros.
tripleee
1

Anda bisa menggunakan s3cmd:

s3cmd du s3://Mybucket -H

atau

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

Ini memberikan objek total dan ukuran ember dalam bentuk yang sangat mudah dibaca.

bpathak
sumber
Apakah dutraverse mendaftar semua objek atau mengambil metadata? Akan sangat menyukai versi api dari versi laporan atau apa yang ditampilkan di konsol aws ...
user67327
0

Hai ada alat pencarian metdata untuk AWS S3 di https://s3search.p3-labs.com/ . Alat ini memberikan statistik tentang objek dalam ember dengan pencarian di metadata.

pyth
sumber
0

Juga Hanzo S3 Alat melakukan hal ini. Setelah diinstal, Anda dapat melakukan:

s3ls -s -H bucketname

Tapi saya percaya ini juga dijumlahkan di sisi klien dan tidak diambil melalui AWS API.

Ville
sumber
0

Dengan program Cloudberry juga memungkinkan untuk membuat daftar ukuran ember, jumlah folder dan total file, mengklik "properti" tepat di atas ember.

KiKo
sumber
0

Jika Anda tidak ingin menggunakan command-line, pada Windows dan OSX, ada aplikasi manajemen file remote tujuan umum yang disebut Cyberduck . Masuk ke S3 dengan pasangan kunci akses / rahasia Anda, klik kanan pada direktori, klik Calculate.

jpillora
sumber
0

Saya menulis skrip Bash, s3-du.sh yang akan mencantumkan file dalam ember dengan s3ls, dan mencetak jumlah file, dan ukuran seperti

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

Skrip lengkap:

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

Itu memang melakukan ukuran subdirektori, karena Amazon mengembalikan nama direktori dan ukuran semua isinya.

Jon Zobrist
sumber
0

CloudWatch memiliki dasbor layanan S3 default sekarang yang mencantumkannya dalam grafik yang disebut "Bucket Size Bytes Average". Saya pikir tautan ini akan berfungsi untuk siapa pun yang sudah masuk ke AWS Console:

flickerfly
sumber
-1

Cara berikut menggunakan AWS PHP SDK untuk mendapatkan ukuran total 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;
Shriganesh Shintre
sumber
-1

Ini bekerja untuk saya ..

aws s3 ls s3://bucket/folder/ --recursive | awk '{sz+=$3} END {print sz/1024/1024 "MB"}'
GrantO
sumber
3
Bisakah Anda menambahkan beberapa detail lagi?
Pierre.Vriens
1
Ini pada dasarnya solusi yang sama dengan jawaban lain yang diposting sekitar setahun sebelumnya.
Louis