402 votes

Comment puis-je obtenir la taille d'un seau Amazon S3 ?

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

El s3cmd fournissent un moyen d'obtenir la taille totale du fichier en utilisant s3cmd du s3://bucket_name mais je m'inquiète de sa capacité à évoluer car il semble qu'il récupère les données de chaque fichier et calcule sa propre somme. Étant donné qu'Amazon facture les 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 ça ressemble à un piratage.

Le Rubis AWS::S3 semblait prometteuse, mais elle ne fournit que le nombre d'éléments du seau, et non la taille totale du seau.

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

0 votes

J'ai écrit un outil pour analyser la taille des seaux : github.com/EverythingMe/ncdu-s3

29 votes

Je m'étonne qu'Amazon facture l'espace, mais ne fournisse pas la taille totale occupée par un seau S3 simplement via le panneau S3.

0 votes

Pour moi, la plupart des réponses ci-dessous prenaient un temps assez long pour récupérer la taille du seau, mais ce script en Python était beaucoup plus rapide que la plupart des réponses -. slsmk.com/getting-the-size-of-an-s3-bucket-using-boto3-for-aws

2voto

NickWoodhams Points 1746

Comme il y a tant de réponses, je me suis dit que j'allais apporter 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 la région, et le nom du seau que vous voulez interroger. Assurez-vous également d'ajouter le paquet nuget AWSSDK.

En faisant un test avec l'un de mes fichiers, j'ai obtenu un nombre de 128075 et une taille de 70,6 Go. Je sais que c'est une précision de 99,9999 %, donc je suis satisfait du 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]);
    }
}

1voto

Dario Points 11

Pour vérifier la taille de tous les buckets, essayez ce bash script.

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

0 votes

Cela a bien fonctionné.

1 votes

Capturer la sortie dans une variable juste pour pouvoir boucler dessus est un anti-modèle inutile.

1voto

bpathak Points 11

Vous pouvez utiliser s3cmd :

s3cmd du s3://Mybucket -H

ou

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

Il indique le nombre total d'objets et la taille du seau sous une forme très lisible.

1 votes

Fait du parcourir la liste de tous les objets ou récupérer les métadonnées ? J'aimerais vraiment avoir une version api de la version des rapports ou ce qui est affiché dans la console aws...

1voto

DCJeff Points 21

Je sais qu'il s'agit d'une question ancienne mais voici un exemple PowerShell :

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

$A contient la taille du seau, et il y a un paramètre de nom de clé si vous voulez juste la taille d'un dossier spécifique dans un seau.

0 votes

Exécutez d'abord la ligne Get-object..puis exécutez $A (pour ceux qui ne sont pas familiers avec PowerShell)

0voto

jpillora Points 101

Si vous ne souhaitez pas utiliser la ligne de commande, il existe sous Windows et OSX une application générale de gestion de fichiers à distance appelée Cyberduck . Connectez-vous à S3 avec votre paire de clés d'accès/secrètes, faites un clic droit sur le répertoire, cliquez sur Calculate .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X