Je voudrais représenter graphiquement la taille (en octets et le nombre d'éléments) d'un compartiment Amazon S3 et je cherche un moyen efficace d'obtenir les données.
Les outils s3cmd permettent d'obtenir la taille totale du fichier à l'aide de s3cmd du s3://bucket_name
, mais je m'inquiète de sa capacité à évoluer car il semble qu'il récupère des données sur chaque fichier et calcule sa propre somme. Comme Amazon facture les utilisateurs en Go-Mois, il semble étrange qu'ils n'exposent pas cette valeur directement.
Bien que Amazon REST renvoie le nombre d'éléments dans un compartiment, s3cmd ne semble pas l'exposer. Je pourrais faire s3cmd ls -r s3://bucket_name | wc -l
mais cela ressemble à un hack.
La bibliothèque Ruby AWS :: S semblait prometteuse, mais ne fournit que le nombre d'éléments de compartiment, pas la taille totale du compartiment.
Quelqu'un connaît-il d'autres outils ou bibliothèques de ligne de commande (préférez Perl, PHP, Python ou Ruby) qui fournissent des moyens d'obtenir ces données?
L'AWS CLI prend désormais en charge le paramètre --query
Qui prend une expression JMESPath .
Cela signifie que vous pouvez additionner les valeurs de taille données par list-objects
En utilisant sum(Contents[].Size)
et compter comme length(Contents[])
.
Cela peut être exécuté à l'aide de l'AWS CLI officielle comme ci-dessous et a été introduit en février 2014
aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"
Cela peut maintenant être fait de manière triviale avec uniquement le client de ligne de commande AWS officiel:
aws s3 ls --summarize --human-readable --recursive s3://bucket-name/
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
À partir du 28 juillet 2015 vous pouvez obtenir ces informations via CloudWatch . Si vous voulez une interface graphique, allez dans console CloudWatch : (Choisissez Région>) Métriques> S3
Ceci est beaucoup plus rapide que certaines des autres commandes publiées ici, car il n'interroge 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 StorageType et BucketName dans l'argument dimensions sinon vous n'obtiendrez aucun résultat. Tout ce que vous devez changer est le --start-date
, --end-time
, et Value=toukakoukan.com
.
Voici un script bash que vous pouvez utiliser pour éviter d'avoir à 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
s3cmd peut le faire:
s3cmd du s3://bucket-name
Si vous téléchargez un rapport d'utilisation , vous pouvez représenter graphiquement les valeurs quotidiennes pour le TimedStorage-ByteHrs
champ.
Si vous voulez ce nombre en Gio, divisez simplement par 1024 * 1024 * 1024 * 24
(c'est-à-dire GiB-heures pour un cycle de 24 heures). Si vous voulez le nombre en octets, il suffit de le diviser par 24 et de le représenter graphiquement.
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"}'
C'est une meilleure commande, ajoutez simplement les 3 paramètres suivants --summarize --human-readable --recursive
après aws s3 ls
. --summarize
n'est pas requis, mais donne une belle touche à la taille totale.
aws s3 ls s3://bucket/folder --summarize --human-readable --recursive
s4cmd est le moyen le plus rapide que j'ai trouvé (un utilitaire de ligne de commande écrit en Python):
pip install s4cmd
Maintenant, pour calculer la taille entière du compartiment à l'aide de plusieurs threads:
s4cmd du -r s3://bucket-name
Vous pouvez utiliser l'utilitaire s3cmd, par exemple:
s3cmd du -H s3://Mybucket
97G s3://Mybucket/
J'ai utilisé S3 REST/Curl API répertorié plus haut dans ce fil et j'ai 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';
?>
Donc, en parcourant l'API et en jouant les mêmes requêtes, S3 produira le contenu entier d'un compartiment en une seule demande et il n'a pas besoin de descendre dans les répertoires. Les résultats nécessitent alors simplement une sommation à travers les différents éléments XML, et non des appels répétés. Je n'ai pas d'échantillon contenant des milliers d'articles, donc je ne sais pas dans quelle mesure il évoluera, mais cela semble assez simple.
... Un peu tard mais, la meilleure façon que j'ai trouvée est d'utiliser les rapports dans le portail AWS. J'ai créé une classe PHP pour télécharger et analyser les rapports. Avec elle, vous pouvez obtenir le nombre total d'objets pour chaque compartiment, la taille totale en Go ou en octets et plus.
Vérifiez-le et faites-moi savoir si cela a été utile
Je recommande d'utiliser S3 Usage Report pour grands compartiments , voir mon How To sur la façon de l'obtenir Fondamentalement, vous devez télécharger Usage Générez un rapport pour le service S3 pour le dernier jour avec Timed Storage - Byte Hrs et analysez-le pour obtenir l'utilisation du disque.
cat report.csv | awk -F, '{printf "%.2f GB %s %s \n", $7/(1024**3 )/24, $4, $2}' | sort -n
La documentation AWS vous explique comment procéder:
aws s3 ls s3://bucketnanme --recursive --human-readable --summarize
Voici la sortie que vous obtenez:
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
Pour une approche vraiment low-tech: utilisez un client S3 qui peut calculer la taille pour vous. J'utilise Panic's Transmit, cliquez sur un seau, faites "Obtenir des informations" et cliquez sur le bouton "Calculer". Je ne sais pas à quel point il est rapide ou précis par rapport à d'autres méthodes, mais il semble redonner la taille que je m'attendais à ce qu'il soit.
Puisqu'il y a tellement de réponses, je me suis dit que je ferais la mienne. J'ai écrit mon implémentation en C # en utilisant LINQPad. Copiez, collez et entrez la clé d'accès, la clé secrète, le point de terminaison de région et le nom de compartiment que vous souhaitez interroger. Assurez-vous également d'ajouter le package de nuget AWSSDK.
En testant l'un de mes seaux, il m'a donné un nombre de 128075 et une taille de 70,6 Go. Je sais que la précision est de 99,9999%, donc je suis bon avec le résultat.
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]);
}
}
Vous pouvez utiliser s3cmd
:
s3cmd du s3://Mybucket -H
ou
s3cmd du s3://Mybucket --human-readable
Il donne le nombre total d'objets et la taille du seau sous une forme très lisible.
Pour vérifier la taille de tous les compartiments, essayez ce script bash
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
Je sais que c'est une question plus ancienne, mais voici un exemple PowerShell:
Get-S3Object -BucketName <buckename> | select key, size | foreach {$A += $_.size}
$A
contient la taille du compartiment, et il y a un paramètre de nom de clé si vous voulez juste la taille d'un dossier spécifique dans un compartiment.
J'ai écrit un script Bash, s3-du.sh qui listera les fichiers dans le bucket avec s3ls, et imprimera le nombre de fichiers, et des tailles comme
s3-du.sh testbucket.jonzobrist.com
149 files in bucket testbucket.jonzobrist.com
11760850920 B
11485205 KB
11216 MB
10 GB
Script complet:
#!/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
Il fait la taille du sous-répertoire, car Amazon renvoie le nom du répertoire et la taille de tout son contenu.
Par Cloudberry programme est également possible de lister la taille du compartiment, la quantité de dossiers et le nombre total de fichiers, en cliquant sur "propriétés" juste en haut du compartiment.
--- Hanzo S3 Tools fait cela. Une fois installé, vous pouvez faire:
s3ls -s -H bucketname
Mais je crois que cela est également résumé du côté client et non récupéré via l'API AWS.
CloudWatch dispose désormais d'un tableau de bord de service S3 par défaut qui le répertorie dans un graphique appelé "Bucket Size Bytes Average". Je pense ce lien fonctionnera pour toute personne déjà connectée à AWS Console:
Si vous ne souhaitez pas utiliser la ligne de commande, sous Windows et OSX, il existe une application de gestion de fichiers à distance à usage général appelée Cyberduck . Connectez-vous à S3 avec votre paire d'accès/clé secrète, faites un clic droit sur le répertoire, cliquez sur Calculate
.
Hé, il y a un outil de recherche de métdonnées pour AWS S3 à https://s3search.p3-labs.com/ . Cet outil donne des statistiques sur les objets dans un compartiment avec recherche sur les métadonnées.