Soru Amazon S3 kepçesinin boyutunu nasıl alabilirim?


Amazon S3 grubunun boyutunu (bayt cinsinden ve öğelerin) grafikle çizmek istiyorum ve verileri elde etmenin etkili bir yolunu arıyorum.

s3cmd araçlar, toplam dosya boyutunu elde etmenin bir yolunu sağlar s3cmd du s3://bucket_nameAncak, her dosya hakkında veri alıp kendi toplamını hesapladığı için ölçekleme yeteneğinden endişeleniyorum. Amazon, kullanıcıları GB-Aylık olarak ücretlendirdiğinden, bu değeri doğrudan göstermedikleri garip görünüyor.

olmasına rağmen Amazon’un REST API'sı bir kovadaki öğe sayısını döndürür, s3cmd açığa çıkmıyor gibi görünüyor. Yapabilirim s3cmd ls -r s3://bucket_name | wc -l ama bu bir kesmek gibi görünüyor.

Yakut AWS :: S3 kütüphane umut verici görünüyordu, ancak toplam kepçe boyutuna değil, yalnızca kepçe öğelerini sağladı.

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


253
2017-11-15 00:40


Menşei


Kepçe boyutunu analiz etmek için bir araç yazdım: github.com/EverythingMe/ncdu-s3 - omribahumi
Amazon'un alan için şarj etmesinden şaşıyorum, ancak S3 paneli aracılığıyla S3 kabini tarafından alınan toplam büyüklüğü sağlamaz. - Luke
Benim için aşağıdaki cevapların çoğu kova uzunluğunu almak için oldukça uzun bir zaman aldı, 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


Cevaplar:


AWS CLI şimdi destekliyor --query bir parametre alır JMESPath ifade.

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

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

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

148
2017-11-16 23:00



Büyük kovalar için (büyük #files), bu yavaşlatıcıdır. Python programı s4cmd "du" hızlı yıldırım: s4cmd du s3://bucket-name - Brent Faust
Bu garip. Kovanınızın genel profili nedir (sığ ve yağ / derin ve ince)? Benziyor s3cmd ile aynı genel giderlere sahip olmalı AWS CLI. İçinde gösterdiği kod  s3cmd Bir gruptaki her dizin için istekte bulunun. - Christopher Hackett
insan tarafından 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
Artık AWS Cloudwatch, kepçe metriği başına "BucketSizeBytes" sunuyor, bu artık doğru çözüm değil. Aşağıda Toukakoukan'ın cevabına bakınız. - cce
s4cmd du harika, teşekkürler @Brent Faust! eklemek için gereken küçük not (ilgili kişiler için) -r Alt dizinlerin boyutlarını da almak için. - Greg Sadetsky


Bu şimdi sadece resmi AWS komut satırı istemcisi ile kolayca yapılabilir:

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

Resmi belgeler

Bu, tüm kovanı saymak istemiyorsanız, yol öneklerini de kabul eder:

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

257
2017-09-09 14:04



Bu en iyi ve en güncel cevaptır - Tim
Kabul et, en iyi cevap budur. - Luis Artola
Bu, özetin gösterilmesinden önce temelde kovadaki tüm nesneleri listelediği için birçok dosyaya sahip olan kovalar için çok yavaştır ve bu nedenle de @Christopher Hackett'in yanıtından önemli ölçüde daha hızlı değildir - bunun dışında çok daha gürültülüdür. - Guss
Gecikmeyi iyileştirmek için aynı alanın bulunduğu bir EC2 örneğinde çalışın - juanmirocks
Sadece özet büyüklüğü ile ilgileniyorsanız, bu en hızlı ve en güncel çözümdür ve bu değeri bulmak için sadece kuyruğu kolayca aktarabilirsiniz. - Charlie Hileman


AWS Konsolu:

İtibariyle 28 Temmuz 2015 bu bilgiyi alabilirsin CloudWatch aracılığıyla. Bir GUI istiyorsan, CloudWatch konsolu: (Bölge Seç>) Metrikler> S3

AWS CLI Komutu:

Bu, burada kaydedilen diğer komutların bazılarından 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 hem StorageType hem de BucketName belirtmelisiniz, aksi halde sonuç almayacaksınız. Değiştirmeniz gereken tek şey --start-date, --end-time, ve Value=toukakoukan.com.


İşte belirtmek zorunda kalmamak için kullanabileceğiniz bir bash betiği --start-date ve --end-time manuel.

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

106
2017-07-31 21:58



Veya içinde CloudWatch konsolu: (Bölge Seç>) Metrikler> S3 - Halil Özgür
Bu, en kolay ve en hızlı çözümdür. Ne yazık ki cevap hala dördüncü sırada. - luk2302
Bu 10million + nesnelerle kova için çalıştı. Ama bash betiği bir şey döndürmedi, GUI'ye gitmek zorunda kaldı. - Petah
Bölgeyi de değiştirmeniz gerekecek. - majikman
may 2018: komut dosyası hataları Invalid value ('1525354418') for param timestamp:StartTime of type timestamp - anneb


s3cmd bunu yapabilirsin :

s3cmd du s3://bucket-name


103
2017-07-08 13:40



Teşekkürler. İşte bir zamanlama. Yaklaşık 33 GB eksik veriyi ve yaklaşık 93000 s3 nesneyi kullanarak yaklaşık bir milyon dosya içeren bir s3ql tekil dosya sistemini barındıran bir kovada, s3cmd du yanıtı hesaplamak için yaklaşık 4 dakika sürdü. Bunun, burada başka bir yerde tarif edilen php gibi diğer yaklaşımlarla nasıl kıyaslandığını merak ediyorum. - nealmcb
Yavaş çünkü S3 ListObjects API çağrısı nesneleri 1000 nesnenin sayfalarına döndürür. I / O, sınırlayıcı faktör olduğundan, herhangi bir çözümün 93000 nesne üzerinde nispeten yavaş olacağını düşünüyorum. - David Snabel-Caunt
s4cmd Aynı şeyi, S3'ün API'sini çok daha hızlı bir şekilde hesaplamak için istekleri çok daha fazla iş parçacığı ile ekleyebilir. Araç son zamanlarda güncellenmedi, ancak İnternet üzerinden geçenler yararlı bulabilir. - Nick Chammas
s4cmd sadece benim için 0 döndürür ve döner BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format. Büyük harfli karakterler için. - Lakitu


Eğer indirirsen kullanım raporu, günlük değerleri TimedStorage-ByteHrs alan.

Bu numarayı GiB'de istiyorsanız, sadece 1024 * 1024 * 1024 * 24 (24 saatlik bir döngü için GiB saattir). Numarayı bayt cinsinden istiyorsanız, sadece 24'e bölün ve grafiği çizin.


22
2017-12-05 17:22





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

18
2018-04-23 11:22



Amazon'un aslında bunu bildirdiği bağlantıyı sağla lütfen. Onu bulamıyorum. - lobi
docs.aws.amazon.com/cli/latest/index.html - dyltini
docs.aws.amazon.com/cli/latest/reference/s3/ls.html daha iyi bir link - Ian Bamforth
Bu cevap benim için en iyi ve hızlı çalıştı. - Miro
En iyi ve en hızlı cevap! - PlagTag


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

pip install s4cmd

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

s4cmd du -r s3://bucket-name

10
2018-03-31 22:12



Yok hayır, s4cmd du s3://123123drink sadece kepçe boyutunu döndürmez. Kovanın boyutunu elde etmek için özyinelemeyi ekleyin -r, bunun gibi: s4cmd du -r s3: // 123123drink - George Chalhoub
Evet, iyi nokta @BukLau (eklendi -r Örneğin, insanlar S3 üzerinde simüle edilmiş klasörleri kullanırken karışıklığı önlemek için. - Brent Faust


Kullandım S3 REST / Curl API'sı Bu iş parçasında daha önce listelenmiş ve şunu yapmıştır:

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





Bu yüzden API aracılığıyla dolaşıyor ve aynı sorguları çalıyor, S3 bir istekteki tüm kovaları tek bir istekle üretecek ve dizinlere inmek zorunda kalmayacak. Sonuçlar daha sonra sadece çeşitli XML öğeleri üzerinden toplanmayı gerektirir ve tekrarlanan çağrıları değil. Binlerce öğeye sahip bir örnek kabına sahip değilim, bu yüzden ne kadar iyi ölçekleneceğini bilmiyorum, ancak oldukça basit görünüyor.


4
2017-11-15 04:00



Bu en iyi seçenek gibi görünüyor. Gelecekte bu gönderiyi güncelleyecek, eğer zayıf ölçeklendiriliyorsa ve başka bir şey yapmam gerekiyorsa. Ham API sonuçlarına kolay erişim sağlayan kitaplık bu PHP'ydi: undesigned.org.za/2007/10/22/amazon-s3-php-class - Garret Heaton
Bu sadece ilk 1000 ürünle sınırlı değil mi? - Charlie Schliesser


... Biraz geç ama bulduğum en iyi yol, AWS portalındaki raporları kullanmak. Raporları indirmek ve ayrıştırmak için bir PHP sınıfı hazırladım. Bununla birlikte, her bir kepçe için toplam nesne sayısını, toplam boyutu GB veya bayt hrs ve daha fazla alabilirsiniz.

Kontrol edin ve yardımcı olduysa bana bildirin.

AmazonTools


4
2017-12-20 22:56



Bu biraz hackish rağmen, ilginç bir çözümdür. Amazon'un sitelerini değiştirdiği zaman, bu durumun kırılmasından endişe duyuyorum, ancak diğer yol çok yavaş hale geldiğinde yeterli nesneye sahip olduğumda bunu denemek zorunda kalabilirim. Bu yaklaşımın bir diğer yararı, herhangi bir API çağrısı için ücret almamanızdır. - Garret Heaton
. . . onun bir varsayımıdır, ama eğer Amazon sitelerinin görünümünü değiştirirse, arka ucu değiştireceklerinden şüphe ettim ki, şimdiki GET ve POST sorguları çalışmalıdır. Dersi, sık sık kullandıklarıma rağmen, her zaman kırıldığım durumda devam ettireceğim.


S3cmd yardımcı programını kullanabilirsiniz, ör .:

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

4
2018-03-09 15:43