Question Comment obtenir la taille d'un compartiment Amazon S3?


J'aimerais représenter graphiquement la taille (en octets et nombre d'éléments) d'un compartiment Amazon S3 et je recherche un moyen efficace d'obtenir les données.

le s3cmd Les outils permettent d’obtenir la taille totale du fichier en utilisant s3cmd du s3://bucket_name, mais je suis inquiet quant à sa capacité à évoluer, car on dirait qu’il récupère des données sur chaque fichier et calcule sa propre somme. Étant donné qu'Amazon facture ses utilisateurs en Go-Mois, il semble étrange qu'ils n'exposent pas cette valeur directement.

Bien que API REST d'Amazon renvoie le nombre d'éléments dans un seau, s3cmd ne semble pas l'exposer. je pourrais faire s3cmd ls -r s3://bucket_name | wc -l mais cela ressemble à un bidouillage.

Le rubis AWS :: S3 La bibliothèque semblait prometteuse, mais ne fournit que le nombre d'éléments de compartiment, pas la taille totale du compartiment.

Est-ce que quelqu'un connaît d'autres outils ou bibliothèques en ligne de commande (préférez Perl, PHP, Python ou Ruby) qui permettent d'obtenir ces données?


248
2017-11-15 00:40


origine


J'ai écrit un outil d'analyse de la taille d'un seau: github.com/EverythingMe/ncdu-s3 - omribahumi
Je suis étonné que Amazon facture pour l'espace, mais ne fournit pas la taille totale occupée par un compartiment S3 simplement via le panneau S3. - Luke
Pour moi, la plupart des réponses ci-dessous ont mis du temps à récupérer la taille du compartiment, mais ce script python était bien plus rapide que la plupart des réponses - slsmk.com/getting-the-size-of-an-s3-bucket-using-boto3-for-aws - Vaulstein


Réponses:


AWS CLI prend désormais en charge la --query paramètre qui prend un JMESPath expressions.

Cela signifie que vous pouvez additionner les valeurs de taille données par list-objects en utilisant sum(Contents[].Size) et compte comme length(Contents[]).

Ceci peut être exécuté à l'aide de l'AWS CLI officiel, comme ci-dessous, et a été introduit dans Février 2014

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

146
2017-11-16 23:00



Pour les grands seaux (gros fichiers), cela est extrêmement lent. L'utilitaire Python s4cmd "du" est rapide comme l'éclair: s4cmd du s3://bucket-name - Brent Faust
C'est étrange. Quel est le profil général de votre seau (peu profond et épais / profond et mince)? Ça ressemble à s3cmd devrait avoir les mêmes frais généraux que AWS CLI. dans le le code qu'il montre  s3cmd faire une demande pour chaque répertoire dans un compartiment. - Christopher Hackett
pour l'obtenir dans un format lisible par l'homme: 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
Maintenant qu'AWS Cloudwatch propose une métrique «BucketSizeBytes» par compartiment, ce n'est plus la bonne solution. Voir la réponse de Toukakoukan ci-dessous. - cce
s4cmd du est merveilleux, merci @Brent Faust! petite note (pour les personnes concernées) que vous devez ajouter -r pour obtenir la taille des sous-répertoires également. - Greg Sadetsky


Ceci peut maintenant être fait de manière triviale avec seulement le client de ligne de commande AWS officiel:

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

Documentation officielle

Cela accepte également les préfixes de chemin si vous ne voulez pas compter le compartiment entier:

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

254
2017-09-09 14:04



C'est la meilleure et la réponse à jour - Tim
D'accord, c'est la meilleure réponse. - Luis Artola
Cette procédure est très lente pour les compartiments contenant de nombreux fichiers car elle répertorie tous les objets du compartiment avant d'afficher le résumé. En outre, elle n'est pas beaucoup plus rapide que la réponse de @Christopher Hackett - à l'exception de celle-ci qui est beaucoup plus bruyante. - Guss
S'exécuter sur une instance EC2 avec la même région de compartiment pour améliorer la latence - juanmirocks
Si vous ne vous intéressez qu'à la taille du résumé, il s'agit de la solution la plus rapide et la plus récente. Vous pouvez simplement faire défiler jusqu'au bout pour trouver cette valeur. - Charlie Hileman


AWS Console:

À partir de 28 juillet 2015 vous pouvez obtenir cette information via CloudWatch. Si vous voulez une interface graphique, allez à la Console CloudWatch: (Choisissez une région>), mesures> S3

Commande AWS CLI:

Ceci est beaucoup plus rapide que certaines des autres commandes publiées ici, car il ne demande pas la taille de chaque fichier individuellement pour calculer la somme.

 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

Important: Vous devez spécifier à la fois StorageType et BucketName dans l'argument de dimensions, sinon vous n'obtiendrez aucun résultat. Tout ce que vous avez besoin de changer est le --start-date, --end-time, et Value=toukakoukan.com.


Voici un script bash que vous pouvez utiliser pour éviter de devoir spécifier --start-date et --end-time manuellement.

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



Ou dans la console CloudWatch: (Choisissez une région>), mesures> S3 - Halil Özgür
C'est de loin la solution la plus simple et la plus rapide. Malheureusement, la réponse n’est encore qu’à la quatrième place. - luk2302
Cela a fonctionné pour mon seau avec 10 millions + objets. Mais le script bash n'a rien retourné, il fallait aller à l'interface graphique). - Petah
Il convient également de noter que vous devrez également changer de région. - majikman
mai 2018: les erreurs de script avec Invalid value ('1525354418') for param timestamp:StartTime of type timestamp - anneb


s3cmd peut le faire :

s3cmd du s3://bucket-name


103
2017-07-08 13:40



Merci. Voici un moment. Sur un compartiment qui contient un système de fichiers dédupliqué s3ql avec environ un million de fichiers utilisant environ 33 Go de données non dupliquées et environ 93 000 objets s3, s3cmd du a pris environ 4 minutes pour calculer la réponse. Je suis curieux de savoir comment cela se compare à d’autres approches comme celle de php décrite ailleurs ici. - nealmcb
C'est lent parce que le Appel API S3 ListObjects renvoie des objets dans des pages de 1000 objets. Comme les E / S sont de loin le facteur limitant, je pense que toute solution sera relativement lente sur 93 000 objets. - David Snabel-Caunt
s4cmd peut également faire la même chose, avec l'avantage supplémentaire de multi-threading les demandes à l'API de S3 pour calculer le résultat plus rapidement. L'outil n'a pas été mis à jour récemment, mais il peut être utile pour les passants Internet. - Nick Chammas
s4cmd ne fait que retourner 0 pour moi, et retourne BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format. pour les seaux avec des caractères majuscules. - Lakitu


Si vous téléchargez un rapport d'utilisation, vous pouvez représenter graphiquement les valeurs quotidiennes du TimedStorage-ByteHrs champ.

Si vous voulez ce nombre en GiB, il suffit de diviser par 1024 * 1024 * 1024 * 24 (c'est GiB-heures pour un cycle de 24 heures). Si vous voulez le nombre en octets, il suffit de diviser par 24 et de tracer le graphique.


22
2017-12-05 17:22





Utilisation des outils de ligne de commande AWS s3 officiels:

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



Fournissez le lien vers l'endroit où amazon l'indique réellement, s'il vous plaît. Je ne peux pas le trouver. - lobi
docs.aws.amazon.com/cli/latest/index.html - dyltini
docs.aws.amazon.com/cli/latest/reference/s3/ls.htmlest un meilleur lien - Ian Bamforth
Cette réponse a fonctionné le mieux et le plus rapide pour moi. - Miro
réponse la meilleure et la plus rapide! - PlagTag


s4cmd est le moyen le plus rapide que j'ai trouvé (un utilitaire de ligne de commande écrit en Python):

pip install s4cmd

Maintenant, calculons la taille totale du compartiment en utilisant plusieurs threads:

s4cmd du -r s3://bucket-name

10
2018-03-31 22:12



Non, s4cmd du s3://123123drink ne retournera pas simplement la taille du seau. Pour obtenir la taille du seau, vous devez ajouter la valeur récursive -r, comme ceci: s4cmd du -r s3: // 123123drink - George Chalhoub
Oui, bon point @BukLau (ajouté -r exemple ci-dessus pour éviter toute confusion lorsque des personnes utilisent des dossiers simulés sur S3). - Brent Faust


J'ai utilisé le API S3 REST / Curl répertorié plus tôt dans ce fil et a fait ceci:

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