Amazon S3 kova boyutunu nasıl alabilirim?


289

Amazon S3 kovasının boyutunu (bayt ve öğe sayısı olarak) grafik haline getirmek istiyorum ve verileri almak için etkili bir yol arıyorum.

S3cmd araçları kullanılarak toplam dosya boyutunu almak için bir yol sağlar s3cmd du s3://bucket_name, ama her dosya hakkında veri getirir ve kendi toplamını hesaplar gibi görünüyor çünkü ölçek kabiliyeti endişeleniyorum. Amazon, kullanıcıları GB Aylarında ücretlendirdiğinden, bu değeri doğrudan göstermemeleri tuhaf görünüyor.

Her ne kadar Amazon'un REST API bir bölümdeki öğelerin sayısını döndürür, s3cmd maruz görünmüyor. Yapabilirim s3cmd ls -r s3://bucket_name | wc -lama bu bir hack gibi görünüyor.

Ruby AWS :: S3 kütüphanesi ümit verici görünüyordu, fakat toplam kepçe boyutunu değil, sadece kepçe öğelerini dolduruyor.

Bu verileri elde etmenin yollarını sağlayan başka herhangi bir komut satırı aracı veya kütüphanesinin (Perl, PHP, Python veya Ruby'yi tercih ediyor) bilgisi olan var mı?


Kova boyutunu analiz etmek için bir araç yazdım: github.com/EverythingMe/ncdu-s3
omribahumi 20:15

19
Amazon'un alandan ücret almasına şaşırdım, ancak S3 panelinin S3 panelinden aldığı toplam boyutu sağlamadım.
Luke

Benim için aşağıdaki cevapların çoğu kova boyutunu almak için oldukça uzun sürdü, ancak bu python betiği cevapların çoğundan çok daha hızlıydı - slsmk.com/getting-the-size-of-an-s3-bucket-using -boto3-for-aws
Vaulstein

Yanıtlar:


168

AWS CLI şimdi --querybir JMESPath ifadesi alan parametreyi destekliyor .

Bu, list-objectskullanarak sum(Contents[].Size)ve saymak gibi verilen boyut değerlerini toplayabileceğiniz anlamına gelir length(Contents[]).

Bu, aşağıdaki gibi resmi AWS CLI kullanılarak çalıştırılabilir ve Şubat 2014'te tanıtılmıştır.

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

21
Büyük kovalar için (büyük # dosyalar), bu inanılmaz derecede yavaştır. Python yardımcı programı s4cmd "du" yıldırım hızlı:s4cmd du s3://bucket-name
Brent Faust

Bu garip. Kepçenizin genel profili nedir (sığ ve yağ / derin ve ince)? Görünüşe göre s3cmdaynı genel giderlere sahip olmalı AWS CLI. Gösterilen kodda s3cmd bir kovadaki her dizin için bir istek yapın.
Christopher Hackett

22
okunabilir formatta elde etmek için: 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
Şimdi AWS Cloudwatch, kova başına metrik bir "BucketSizeBytes" sunumu sağladığından, bu artık doğru çözüm değildir. Aşağıdaki Toukakoukan'ın cevabına bakınız.
cce

2
s4cmd duharika, teşekkür ederim @Brent Faust! -ralt dizinlerin boyutlarını da almak için eklemeniz gereken küçük not (ilgililer için) .
Greg Sadetsky,

330

Bu şimdi sadece resmi AWS komut satırı istemcisiyle önemsiz bir şekilde yapılabilir:

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

Resmi belgeler

Ayrıca, tüm kovayı saymak istemiyorsanız yol öneklerini de kabul eder:

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

23
Bu en iyi ve en güncel cevaptır
Tim

2
Kabul ediyorum, bu en iyi cevap.
Luis Artola

24
Bu, çok sayıda dosya içeren kovalar için özeti göstermeden önce temel olarak kovadaki tüm nesneleri listelediğinden ve @Christopher Hackett'in cevabından önemli ölçüde daha hızlı olmadığı için çok yavaş - bu çok daha gürültülü.
Guss


1
Bu, dizin ağacındaki TÜM dosyaların boyutunu gösterir. Ya sadece dizin için toplam boyutta olmak istersem?
Chris F,

130

AWS Konsolu:

İtibariyle Temmuz 2015 28 bu bilgileri alabilirsiniz CloudWatch aracılığıyla . Bir GUI istiyorsanız, CloudWatch konsoluna gidin : (Bölge> Seç) Metrikler> S3

AWS CLI Komutu:

Bu, burada yayınlanan diğer komutlardan bazılarından çok daha hızlıdır, çünkü toplamı hesaplamak için her dosyanın boyutunu ayrı ayrı sorgulamaz.

 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

Önemli : Boyutlar argümanında StorageType ve BucketName öğelerini belirtmeniz gerekir, aksi takdirde sonuç alamazsınız. Değiştirmeniz gereken tek şey --start-date, --end-timeve Value=toukakoukan.com.


İşte belirtmek --start-dateve --end-timeel ile kullanmak zorunda kalmamak için kullanabileceğiniz bir bash betiği .

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

25
Veya CloudWatch konsolunda : (Bölge Seç>) Metrik> S3
Halil Özgür

3
Bu, bugüne kadarki en kolay ve en hızlı çözümdür. Ne yazık ki cevap hala sadece dördüncü sırada.
luk2302,

Bu, 10 milyon + nesneli kepçem için çalıştı. Fakat bash betiği hiçbir şey döndürmedi, GUI'ye gitmek zorunda kaldı).
Petah

1
Bölgeyi de değiştirmek zorunda kalacağınız da belirtilmelidir
majikman

mayıs 2018: betiğin hatalarıInvalid value ('1525354418') for param timestamp:StartTime of type timestamp
anneb

106

s3cmd bunu yapabilir:

s3cmd du s3://bucket-name


Teşekkürler. İşte biraz zamanlama. S3ql veri tekilleştirilen bir dosya sistemi, yaklaşık 33 GB tahmin edilmemiş veri kullanan yaklaşık bir milyon dosya ve yaklaşık 93000 s3 nesne kullanan bir kovada, s3cmd du, cevabı hesaplamak için yaklaşık 4 dakika sürdü. Bunun, burada başka yerde açıklanan php gibi diğer yaklaşımlarla nasıl karşılaştığını bilmek merak ediyorum.
nealmcb,

1
S3 ListObjects API çağrısı , nesneleri 1000 nesnenin sayfalarına döndürdüğü için yavaştır . G / Ç, sınırlayıcı bir faktör olduğundan, herhangi bir çözümün 93000 nesne üzerinde nispeten yavaş olacağını düşünüyorum.
David Snabel-Caunt

11
s4cmd de aynı şeyi yapabilir, sonucun daha hızlı hesaplanması için S3'ün API'sine çoklu dilekleme istekleri de eklenmiştir. Araç yakın zamanda güncellenmedi, ancak İnternetten geçenler tarafından faydalı bulunabilir.
Nick Chammas

s4cmd sadece benim için 0 döndürür BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.ve büyük harf karakterli kovalar için döndürür .
Lakitu

22

Bir kullanım raporu indirirseniz , TimedStorage-ByteHrsalanın günlük değerlerini grafik olarak çizebilirsiniz .

Eğer bu numarayı GiB'de istiyorsanız, sadece bölün 1024 * 1024 * 1024 * 24(24 saatlik bir döngü için GiB saatleri). Sayıyı bayt cinsinden istiyorsanız, 24'e bölün ve grafiği kaldırın.


19

Resmi AWS s3 komut satırı araçlarını kullanarak:

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

Bu daha iyi bir komuttur, --summarize --human-readable --recursivesonra sadece aşağıdaki 3 parametreyi ekleyin aws s3 ls. --summarizegerekli değildir ancak toplam boyuta güzel bir dokunuş verir.

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

1
Amazon'un gerçekte bunu söylediği yere bağlantı verin. Bulamıyorum.
lobi



4
Bu cevap benim için en iyi ve en hızlı şekilde çalıştı.
Miro

2
en iyi ve en hızlı cevap!
PlagTag

11

s4cmd, bulduğum en hızlı yoldur (Python ile yazılmış bir komut satırı yardımcı programı):

pip install s4cmd

Şimdi birden fazla iş parçacığı kullanarak tüm kova boyutunu hesaplamak için:

s4cmd du -r s3://bucket-name

6
Hayır, s4cmd du s3://123123drinkyalnızca kepçenin boyutunu döndürmeyecektir. Kova boyutunu elde etmek için, özyinelemeli ekleyin, şöyle -r: s4cmd du -r s3: // 123123drink
George Chalhoub 9:15

1
Evet, iyi nokta @BukLau ( -rinsanlar S3'te benzetilmiş klasörler kullanırken karışıklığı önlemek için yukarıdaki örneğe eklendi ).
Brent Faust

6

Bu konuda daha önce listelenen S3 REST / Curl API kullandım ve şunu yaptım:

<?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

S3cmd yardımcı programını kullanabilirsiniz, örneğin:

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

5

Bu nedenle, API'de dolaşarak ve aynı sorguları oynayarak, S3 bir kepçenin tüm içeriğini tek bir istekte üretecek ve dizine girmesi gerekmeyecek. Sonuçlar daha sonra sadece çeşitli XML öğeleri yoluyla toplanmayı gerektiriyor ve tekrarlanan çağrılar gerektirmiyor. Binlerce öğeye sahip örnek bir kepçem yok, bu yüzden ne kadar iyi ölçekleneceğini bilmiyorum, ama oldukça basit görünüyor.


Bu en iyi seçenek gibi görünüyor. Gelecekte zayıf ölçekler varsa bu yazıyı güncelleyecektir ve başka bir şey yapmam gerekiyor. Ham API sonuçlarına kolay erişim sağlayan kitap şu PHP idi: undesigned.org.za/2007/10/22/amazon-s3-php-class
Garret Heaton

Bu sadece ilk 1000 maddeyle sınırlı değil mi?
Charlie Schliesser

4

... Biraz geç ama en iyi bulduğum yol AWS portalındaki raporları kullanmak. Raporları indirmek ve ayrıştırmak için bir PHP sınıfı yaptım. Bununla beraber her kova için toplam nesne sayısını, GB cinsinden toplam boyutu veya bayt saate ve daha fazlasını elde edebilirsiniz.

Bir göz atın ve yardımcı olup olmadığını bana bildirin

AmazonTools


Bu biraz ilginç olsa da ilginç bir çözüm. Amazon sitelerini değiştirirse / değiştirdiğinde bunun için endişelenmekle birlikte, diğer yolun çok yavaş olması için yeterli nesneye sahip olduğumda bunu denemek zorunda kalabilirim. Bu yaklaşımın bir başka yararı da, herhangi bir API çağrısı için ücret almamanızdır.
Garret Heaton,

. . . bir varsayım ama eğer Amazon sitelerinin görünümünü değiştirirse, arka uçlarını çok değiştireceklerinden şüpheliyim, bu da mevcut GET ve POST sorgularının çalışması gerektiği anlamına geliyor. Dersi, sıklıkla kullandığım gibi yine de koparsa koruyacağım.

3

Ben S3 Kullanımı Raporu'nu kullanmanızı öneririz büyük kova , bkz benim Nasıl o Temel olarak Zamanlı Depolama geçen gün için S3 hizmeti için Kullanım Raporu indirmeniz gerekir almak konusunda - Byte Saat ve disk kullanımını almak için ayrıştırmak.

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

3

AWS belgeleri size nasıl yapılacağını anlatır:

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

Bu elde ettiğiniz çıktı:

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

2

Gerçekten düşük teknolojili bir yaklaşım için: sizin için boyutunu hesaplayabilen bir S3 istemcisi kullanın. Panic Transmit kullanıyorum, bir kovaya tıklayın, "Bilgi Al" yapın ve "Hesapla" düğmesine tıklayın. Diğer yöntemlerle olan ilişkisinin ne kadar hızlı veya doğru olduğundan emin değilim, ancak olmasını beklediğim boyutu geri veriyor gibi görünüyor.


2

Çok fazla cevap olduğundan, kendimle görüşeceğimi düşündüm. Uygulamamı C # dilinde LINQPad kullanarak yazdım. Sorgulamak istediğiniz erişim anahtarını, gizli anahtarı, bölge bitiş noktasını ve kova adını kopyalayın, yapıştırın ve girin. Ayrıca, AWSSDK nuget paketini de eklediğinizden emin olun.

Kovalarımdan birine karşı test ettiğimde bana 128075 sayımı ve 70.6GB büyüklüğünde bir sayı verdi. Bunun% 99.9999 doğru olduğunu biliyorum, bu yüzden sonuçta iyiyim.

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]);
    }
}

2

Boyutu AWS Konsolundan almak istiyorsanız:

  1. S3'e gidin ve kova adına tıklayın
  2. "Yönetim" sekmesini seçin

görüntü tanımını buraya girin

  1. Metrikler sekmesini seçin

Varsayılan olarak, kovanın Depolama Metrik değerini görmelisiniz .


1

Bunun daha eski bir soru olduğunu biliyorum ama işte bir PowerShell örneği:

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

$A kepçe boyutunu içerir ve sadece bir kepçe içindeki belirli bir klasörün boyutunu istiyorsanız, bir anahtar ismi parametresi vardır.


Önce Get-object..line'ı çalıştırın ve sonra $ A'yı çalıştırın (PowerShell'e aşina olmayanlar için)
Faiz

1

Tüm kova boyutunu kontrol etmek için bu bash betiğini deneyin

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

Bu harika çalıştı.
Mike Barlow - BarDev

Çıktıyı bir değişkende yakalamak, böylece üzerinden dönebildiğiniz için israflı bir kayma önleyicidir.
üçlü

1

Kullanabilirsiniz s3cmd:

s3cmd du s3://Mybucket -H

veya

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

Kepçenin toplam nesnelerini ve boyutunu çok okunabilir bir biçimde verir.


Does duçapraz liste tüm nesneler veya meta verileri almak? Gerçekten raporlar sürümünün bir api sürümü veya aws konsolunda ne görüntülendiğini ister misiniz ...
user67327


0

Ayrıca Hanzo S3 Araçları bunu yapar. Kurulduktan sonra şunları yapabilirsiniz:

s3ls -s -H bucketname

Ancak bunun müşteri tarafında toplandığına ve AWS API'sinden alınmadığına inanıyorum.


0

By cloudberry programı sağ kepçenin üstünde "özelliklerini" tıklayarak kova boyutunu, klasörler ve toplam dosyaların miktarını listelemek de mümkündür.


0

Komut satırını kullanmak istemiyorsanız, Windows ve OSX'te, Cyberduck adlı genel amaçlı bir uzaktan dosya yönetimi uygulaması vardır . Erişim / gizli anahtar çiftinizle S3'e giriş yapın, dizine sağ tıklayın, tıklayın Calculate.


0

Bash komut dosyası, s3ls ile kovadaki dosyaları listeleyecek s3-du.sh yazıp, dosya sayısını ve boyutunu yazdıracak

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

Tam komut dosyası:

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

Amazon, dizin adını ve tüm içeriğinin boyutunu döndürdüğü için alt dizin boyutunu yapar.



-1

Aşağıdaki şekilde, kepçe toplam boyutunu elde etmek için AWS PHP SDK kullanılır.

// 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;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.