Vraag Hoe kan ik de grootte van een Amazon S3-bucket krijgen?


Ik wil de grootte (in bytes en aantal items) van een Amazon S3-bucket in een grafiek weergeven en ben op zoek naar een efficiënte manier om de gegevens op te halen.

De s3cmd tools bieden een manier om de totale bestandsgrootte te gebruiken s3cmd du s3://bucket_name, maar ik maak me zorgen over de mogelijkheid om te schalen omdat het lijkt alsof het gegevens over elk bestand ophaalt en zijn eigen som berekent. Aangezien Amazon gebruikers in GB-maanden aanrekent, lijkt het vreemd dat ze deze waarde niet direct blootgeven.

Hoewel Amazon's REST API retourneert het aantal items in een bucket, s3cmd lijkt het niet te ontmaskeren. Ik zou het kunnen doen s3cmd ls -r s3://bucket_name | wc -l maar dat lijkt op een hack.

The Ruby AWS :: S3 bibliotheek zag er veelbelovend uit, maar biedt alleen het aantal bucket-items, niet de totale bucket-grootte.

Is iemand op de hoogte van andere opdrachtregelprogramma's of bibliotheken (liever Perl, PHP, Python of Ruby) die manieren bieden om deze gegevens te krijgen?


248
2017-11-15 00:40


oorsprong


Ik heb een tool geschreven voor het analyseren van de bucketgrootte: github.com/EverythingMe/ncdu-s3 - omribahumi
Ik ben verbaasd dat Amazon de ruimte in rekening brengt, maar niet de totale grootte van een S3-bucket alleen via het S3-paneel. - Luke
Voor mij kostten de meeste van de onderstaande antwoorden nogal wat tijd om de bakgrootte op te halen, maar dit pythonscript was veel sneller dan de meeste antwoorden - slsmk.com/getting-the-size-of-an-s3-bucket-using-boto3-for-aws - Vaulstein


antwoorden:


De AWS CLI ondersteunt nu de --query parameter die een JMESPath uitdrukkingen.

Dit betekent dat u de opgegeven waarden kunt optellen list-objects gebruik makend van sum(Contents[].Size) en tellen als length(Contents[]).

Dit kan worden uitgevoerd met behulp van de officiële AWS CLI zoals hieronder en werd geïntroduceerd in Februari 2014

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

146
2017-11-16 23:00



Voor grote buckets (grote #files) is dit verschrikkelijk traag. De Python utility s4cmd "du" is razendsnel: s4cmd du s3://bucket-name - Brent Faust
Dat is vreemd. Wat is het algemene profiel van uw emmer (ondiep en dik / dun en dun)? Het lijkt op s3cmd moet dezelfde algemene kosten hebben als AWS CLI. In de code die wordt weergegeven  s3cmd maak een aanvraag voor elke map in een bucket. - Christopher Hackett
om het in een voor mensen leesbaar formaat te krijgen: 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
Nu AWS Cloudwatch een per bucket-metriek van "BucketSizeBytes" biedt, is dit niet langer de juiste oplossing. Zie het antwoord van Toukakoukan hieronder. - cce
s4cmd du is geweldig, dank je @Brent Faust! kleine notitie (voor de betrokkenen) die u moet toevoegen -r om de grootte van submappen ook te krijgen. - Greg Sadetsky


Dit kan nu eenvoudig worden gedaan met alleen de officiële AWS-opdrachtregelclient:

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

Officiële documentatie

Dit accepteert ook padvoorvoegsels als u niet de hele bucket wilt tellen:

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

254
2017-09-09 14:04



Dit is het beste en meest actuele antwoord - Tim
Mee eens, dit is het beste antwoord. - Luis Artola
Dit is erg langzaam voor emmers met veel bestanden, omdat het in feite alle objecten in de emmer opsomt voordat het de samenvatting laat zien, en omdat het niet significant sneller is dan het antwoord van @Christopher Hackett - behalve dat deze veel luidruchtiger is. - Guss
Uitvoeren op een EC2-instantie met hetzelfde bucket-gebied om de latentie te verbeteren - juanmirocks
Als u alleen geïnteresseerd bent in de samenvattingsgrootte, is dit de snelste en meest actuele oplossing en kunt u gewoon door de staart lopen om die waarde te vinden. - Charlie Hileman


AWS-console:

Vanaf 28 juli 2015 je kunt deze informatie krijgen via CloudWatch. Als u een GUI wilt, gaat u naar CloudWatch-console: (Kies Regio>) Statistieken> S3

AWS CLI-opdracht:

Dit is veel sneller dan sommige van de andere hier geposte commando's, omdat het niet de grootte van elk bestand afzonderlijk opzoekt om de som te berekenen.

 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

Belangrijk: U moet zowel StorageType als BucketName opgeven in het dimensievoorarief, anders krijgt u geen resultaten. Het enige dat u hoeft te veranderen is het --start-date, --end-time, en Value=toukakoukan.com.


Hier is een bash-script dat je kunt gebruiken om te voorkomen dat je het moet opgeven --start-date en --end-time handmatig.

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



Of in de CloudWatch-console: (Kies Regio>) Statistieken> S3 - Halil Özgür
Dit is verreweg de gemakkelijkste en snelste oplossing. Helaas staat het antwoord nog steeds op de vierde plaats. - luk2302
Dit werkte voor mijn emmer met 10 miljoen + objecten. Maar het bash-script retourneerde niets, moest naar de GUI gaan). - Petah
Er moet ook worden opgemerkt dat u ook de regio moet wijzigen - majikman
mei 2018: de scriptfouten met Invalid value ('1525354418') for param timestamp:StartTime of type timestamp - anneb


s3cmd kan dit doen :

s3cmd du s3://bucket-name


103
2017-07-08 13:40



Bedankt. Hier is wat timing. Op een bucket met een s3ql gededupliceerd bestandssysteem met ongeveer een miljoen bestanden met ongeveer 33 GB aan ongedateerde data, en ongeveer 93000 s3-objecten, duurde s3cmd du ongeveer 4 minuten om het antwoord te berekenen. Ik ben benieuwd hoe dat te vergelijken is met andere benaderingen zoals de php die hier elders wordt beschreven. - nealmcb
Het is traag omdat het S3 ListObjects API-aanroep retourneert objecten op pagina's van 1000 objecten. Omdat I / O verreweg de beperkende factor is, denk ik dat elke oplossing relatief langzaam zal zijn over 93000 objecten. - David Snabel-Caunt
s4cmd kan ook hetzelfde doen, met als bijkomend voordeel multi-threading van de aanvragen naar S3's API om het resultaat sneller te berekenen. De tool is niet recentelijk bijgewerkt, maar de internet-passant kan het handig vinden. - Nick Chammas
s4cmd retourneert gewoon 0 voor mij en retourneert BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format. voor emmers met hoofdletters. - Lakitu


Als u een downloadt gebruiksrapport, kunt u de dagelijkse waarden van de TimedStorage-ByteHrs veld.

Als je dat nummer in GiB wilt, deel je gewoon door 1024 * 1024 * 1024 * 24 (dat zijn GiB-uren voor een cyclus van 24 uur). Als je het aantal in bytes wilt, deel je gewoon door 24 en graaf weg.


22
2017-12-05 17:22





De officiële AWS s3-opdrachtregelhulpprogramma's gebruiken:

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



Geef de link naar waar Amazon dit alsjeblieft toestaat. Ik kan het niet vinden. - lobi
docs.aws.amazon.com/cli/latest/index.html - dyltini
docs.aws.amazon.com/cli/latest/reference/s3/ls.html is een betere link - Ian Bamforth
Dit antwoord werkte het beste en snelst voor mij. - Miro
beste en snelste antwoord! - PlagTag


s4cmd is de snelste manier die ik heb gevonden (een opdrachtregelprogramma geschreven in Python):

pip install s4cmd

Nu om de hele bucket-grootte te berekenen met meerdere threads:

s4cmd du -r s3://bucket-name

10
2018-03-31 22:12



Nee, s4cmd du s3://123123drink zal niet eenvoudig de grootte van de emmer retourneren. Om de grootte van de emmer te krijgen, voeg je het recursieve toe -r, zoals dit: s4cmd du -r s3: // 123123drink - George Chalhoub
Ja, goed punt @BukLau (toegevoegd -r bijvoorbeeld om verwarring te voorkomen wanneer mensen gesimuleerde mappen op S3 gebruiken). - Brent Faust


Ik gebruikte de S3 REST / Curl API eerder vermeld in deze thread en deed dit:

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





Dus door de API te slepen en dezelfde zoekopdrachten te spelen, zal S3 de volledige inhoud van een bucket in één verzoek produceren en hoeft het niet in mappen te gaan. De resultaten vereisen dan alleen maar sommatie door de verschillende XML-elementen, en niet door herhaalde oproepen. Ik heb geen monsteremmer met duizenden items, dus ik weet niet hoe goed hij zal schalen, maar het lijkt redelijk simpel.


4
2017-11-15 04:00



Dit lijkt de beste optie te zijn. Zal dit bericht in de toekomst updaten als het slecht scoort en ik iets anders moet doen. De bibliotheek die uiteindelijk gemakkelijk toegang gaf tot de onbewerkte API-resultaten was deze PHP-één: undesigned.org.za/2007/10/22/amazon-s3-php-class - Garret Heaton
Is dat niet alleen beperkt tot de eerste 1000 items? - Charlie Schliesser


... Een beetje laat, maar de beste manier die ik heb gevonden is door de rapporten in de AWS-portal te gebruiken. Ik heb een PHP-klasse gemaakt voor het downloaden en analyseren van de rapporten. Hiermee kunt u het totale aantal objecten voor elke bucket, de totale grootte in GB of byte uur en meer, opvragen.

Bekijk het en laat me weten of het nuttig was

AmazonTools


4
2017-12-20 22:56



Dit is een interessante oplossing, hoewel een beetje hackish. Bezorgd over het breken als / wanneer Amazon hun site verandert, maar ik moet dit misschien uitproberen zodra ik genoeg objecten heb die anders te langzaam worden. Een ander voordeel van deze aanpak is dat u voor geen enkele API-aanroep in rekening wordt gebracht. - Garret Heaton
. . . het is een veronderstelling, maar als Amazon het uiterlijk van hun site verandert, betwijfel ik of ze de back-end veel zouden veranderen, wat betekent dat de huidige GET- en POST-query's zouden moeten werken. Ik zal de klas behouden in het geval dat deze toch breekt omdat ik hem vaak gebruik.


U kunt het hulpprogramma s3cmd gebruiken, bijvoorbeeld:

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

4
2018-03-09 15:43