Comment puis-je savoir combien d'objets j'ai stockés dans un compartiment S3?

155

À moins que je ne manque quelque chose, il semble qu'aucune des API que j'ai examinées ne vous dira combien d'objets se trouvent dans un compartiment / dossier S3 (préfixe). Existe-t-il un moyen d'obtenir un décompte?

des champs
la source
Cette question pourrait être utile: stackoverflow.com/questions/701545/…
Brendan Long
1
La solution existe maintenant en 2015: stackoverflow.com/a/32908591/578989
Mayank Jaiswal
Voir ma réponse ci-dessous: stackoverflow.com/a/39111698/996926
advncd
Réponse 2017: stackoverflow.com/a/42927268/4875295
cameck

Réponses:

40

Il n'y a aucun moyen, sauf si vous

  1. listez-les tous par lots de 1000 (ce qui peut être lent et sucer la bande passante - Amazon semble ne jamais compresser les réponses XML), ou

  2. connectez-vous à votre compte sur S3 et accédez à Compte - Utilisation. Il semble que le service de facturation sache exactement combien d'objets vous avez stockés!

Le simple téléchargement de la liste de tous vos objets prendra en fait du temps et coûtera de l'argent si vous avez 50 millions d'objets stockés.

Voir également ce fil sur StorageObjectCount - qui se trouve dans les données d'utilisation.

Une API S3 pour obtenir au moins les bases, même si elle avait des heures, serait géniale.

Tom Andersen
la source
Ce lien est mort, au fait.
champs
Si vous êtes paresseux comme moi, Newvem le fait essentiellement en votre nom et agrège / suit les résultats au niveau par compartiment sur votre compte S3.
rcoup
2
Pourriez-vous mettre à jour votre réponse pour inclure la réponse de @ MayankJaiswal?
Joseph Casey
1
le service de facturation sait tout! pas étonnant qu'ils aient le pouvoir de détruire la côte est de la s3 par accident
ski_squaw
256

Utilisation de l'AWS CLI

aws s3 ls s3://mybucket/ --recursive | wc -l 

ou

aws cloudwatch get-metric-statistics \
  --namespace AWS/S3 --metric-name NumberOfObjects \
  --dimensions Name=BucketName,Value=BUCKETNAME \
              Name=StorageType,Value=AllStorageTypes \
  --start-time 2016-11-05T00:00 --end-time 2016-11-05T00:10 \
  --period 60 --statistic Average

Remarque: la commande cloudwatch ci-dessus semble fonctionner pour certains, mais pas pour d'autres. Discuté ici: https://forums.aws.amazon.com/thread.jspa?threadID=217050

Utilisation d'AWS Web Console

Vous pouvez consulter la section métrique de cloudwatch pour obtenir un nombre approximatif d'objets stockés. entrez la description de l'image ici

J'ai environ 50 millions de produits et il a fallu plus d'une heure pour compter en utilisant aws s3 ls

Mayank Jaiswal
la source
18
Cela devrait être plus proche du sommet.
Joseph Casey
3
@JosephMCasey Je suis d'accord. Cela fonctionne également pour donner le nombre d'objets dans un répertoire avec un compartiment comme celui-ci:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
tim peterson
1
Donne cette erreur lorsque j'ai exécuté ce qui précède dans l'invite cmd - 'wc' n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes. - Je suis assez nouveau dans ce domaine, alors quelqu'un peut-il donner une solution?
Sandun
Un avertissement que CloudWatch ne semble pas très fiable. J'ai un fichier mp4 dans un compartiment que CloudWatch (métrique NumberOfObjects) compte pour 2300 objets distincts. J'ai obtenu le bon numéro avec AWS CLI.
AlexK
Pourquoi «moyen»? Est-ce que quelqu'un ne voudrait pas plutôt "Sum"?
ffxsam
150

Il existe un --summarizecommutateur qui inclut des informations récapitulatives sur le compartiment (c'est-à-dire le nombre d'objets, la taille totale).

Voici la bonne réponse en utilisant AWS cli:

aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"

Total Objects: 194273

Voir la documentation

advncd
la source
4
C'est génial: Total Objects: 7235 Total Size: 475566411749- si facile.
bonh
16
Malheureusement, il y a toujours le plus gros frais généraux de lister les milliers d'objets (actuellement à 600000 plus, donc cela prend beaucoup de temps)
MichaelChirico
combien cela coûtera-t-il pour exécuter cette tâche sur un seau avec 5 millions d'objets?
Psychozoic
2
Cette réponse est extrêmement inefficace, potentiellement très lente et coûteuse. Il parcourt tout le seau pour trouver la réponse.
weaver
3
Et puis-je ajouter que l'itération de plus de 1,2 milliard d'objets stockés dans un stockage standard peut coûter environ 6000 dollars.
C Johnson le
66

Bien que cette question soit ancienne et que des commentaires aient été fournis en 2015, pour le moment, c'est beaucoup plus simple, car la console Web S3 a activé une option "Obtenir la taille":

entrez la description de l'image ici

Qui fournit ce qui suit:

entrez la description de l'image ici

gvasquez
la source
1
Oui, la nouvelle AWS Console, bien que cela me fasse mal aux yeux, rend le calcul du nombre d'objets et de la taille totale disponibles en un clic.
Ani le
11
Cela semble fonctionner uniquement au niveau du dossier. "Obtenir la taille" n'est pas disponible au niveau du bucket
G-.
1
@G-. Que faire si vous sélectionnez tous les dossiers du compartiment?
gvasquez
4
@G-. Cependant, la case «Sélectionner tout» sélectionne uniquement les dossiers et objets affichés dans la page, pas tous les dossiers / objets du compartiment.
gparis
2
@gparis bon point. A noter. Merci. Il semble donc que dans la console, nous n'avons pas d'option s'il y a plus de fichiers ou de dossiers que ce qui peut être affiché sur une seule page
G-.
50

Si vous utilisez l' outil de ligne de commande s3cmd , vous pouvez obtenir une liste récursive d'un compartiment particulier, en la générant dans un fichier texte.

s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt

Ensuite, sous Linux, vous pouvez exécuter un wc -l sur le fichier pour compter les lignes (1 ligne par objet).

wc -l listing.txt
Jim Murphy
la source
La -rcommande dans la commande est pour --recursive, donc cela devrait également fonctionner pour les sous-dossiers.
Deepak Joy
3 notes à ce sujet. a.) vous devriez utiliser aws s3 lsplutôt que s3cmd car c'est plus rapide. b.) Pour les grands seaux, cela peut prendre beaucoup de temps. Il a fallu environ 5 minutes pour les fichiers de 1 mil. c.) Voir ma réponse ci-dessous sur l'utilisation de cloudwatch.
mastaBlasta
46

Il existe maintenant une solution simple avec l'API S3 (disponible dans AWS cli):

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

ou pour un dossier spécifique:

aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"
Raphael
la source
1
Raphael, votre requête de dossier fonctionne très bien, sauf lorsque le dossier est vide ou n'existe pas, alors vous obtenez: Dans function length (), type invalide pour valeur: Aucun, attendu l'un de: ['string', 'array' , 'object'], a reçu: "null" Existe-t-il un moyen de simplement le faire afficher 0 si le dossier est vide ou ne se ferme pas?
user3591836
1
Illegal token value '(Contents[])]' J'obtiens (version 1.2.9 de aws-cli), lorsque je suis juste en train d'utiliser --bucket my-bucketet A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existquand je l' utilise --bucket s3://my-bucket. (Il existe définitivement et contient plus de 1000 fichiers.)
Darren Cook
@DarrenCook supprime s3: // du nom du compartiment. Le client ne semble pas prendre en charge le protocole.
Sriranjan Manjunath
C'est beaucoup plus rapide que les exemples wc -l. Avec mes seaux, cela compterait environ 3 à 4 000 objets / s. Donc ~ 5 minutes par million d'objets. "Get Size" dans l'interface graphique Web S3 utilise probablement quelque chose de similaire sous le capot car cela prend à peu près le même temps.
notpeter
Pour les très gros seaux, c'était la seule solution qui a fonctionné pour moi dans un délai raisonnable de (moins de 20 minutes)
Nick Sarafa
40

Vous pouvez utiliser les métriques AWS cloudwatch pour s3 pour voir le nombre exact de chaque compartiment. métrique cloudwatch lorsque vous sélectionnez un bucket

mastaBlasta
la source
Je pense que c'est la meilleure réponse
Oktav
La seule vraie réponse, sans faire quelque chose de ridicule comme lister 1m + clés. J'ai oublié que c'était là.
Andrew Backer
Cela nécessite plus de votes positifs. Toutes les autres solutions évoluent mal en termes de coût et de temps.
Aaron R.
5

Accédez à AWS Billing, puis aux rapports, puis aux rapports d'utilisation AWS. Sélectionnez Amazon Simple Storage Service, puis Operation StandardStorage. Ensuite, vous pouvez télécharger un fichier CSV qui inclut un UsageType de StorageObjectCount qui répertorie le nombre d'éléments pour chaque compartiment.

Kenan
la source
4

Vous pouvez facilement obtenir le décompte total et l'historique si vous allez dans l'onglet "Gestion" de la console s3 puis cliquez sur "Métriques" ... Capture d'écran de l'onglet

Tilan Ukwatta
la source
pourriez-vous mettre à jour l'image pour afficher le NumberOfObjects (count/day)graphique? Ce serait mieux puisque c'est directement lié à la question. Dans votre capture d'écran, vous montrez ce BucketSizeBytes (bytes/day)qui, bien qu'utile, n'est pas directement lié au problème.
guzmonne
1
À partir de 2019, cela devrait maintenant être la réponse acceptée. Tout le reste est obsolète ou lent.
C Johnson le
2

L'API renverra la liste par incréments de 1000. Vérifiez la propriété IsTruncated pour voir s'il y en a encore plus. Si tel est le cas, vous devez effectuer un autre appel et passer la dernière clé que vous avez obtenue comme propriété Marker lors du prochain appel. Vous continueriez alors à boucler comme ceci jusqu'à ce que IsTruncated soit faux.

Voir ce document Amazon pour plus d'informations: Itérer des résultats multi-pages

BigJoe714
la source
2

Ancien fil, mais toujours pertinent car je cherchais la réponse jusqu'à ce que je viens de comprendre cela. Je voulais un nombre de fichiers en utilisant un outil basé sur l'interface graphique (c'est-à-dire pas de code). Il se trouve que j'utilise déjà un outil appelé 3Hub pour les transferts par glisser-déposer vers et depuis S3. Je voulais savoir combien de fichiers j'avais dans un compartiment particulier (je ne pense pas que la facturation le décompose en compartiments).

So, using 3Hub, 
- list the contents of the bucket (looks basically like a finder or explorer window)
- go to the bottom of the list, click 'show all'
- select all (ctrl+a)
- choose copy URLs from right-click menu
- paste the list into a text file (I use TextWrangler for Mac) 
- look at the line count  

J'avais 20521 fichiers dans le seau et j'ai fait le décompte des fichiers en moins d'une minute.

Darby
la source
2

J'ai utilisé le script python de scalablelogic.com (en ajoutant la journalisation du comptage). A très bien fonctionné.

#!/usr/local/bin/python

import sys

from boto.s3.connection import S3Connection

s3bucket = S3Connection().get_bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.list():
    totalCount += 1
    size += key.size

print 'total size:'
print "%.3f GB" % (size*1.0/1024/1024/1024)
print 'total count:'
print totalCount
Tayler
la source
Juste pour que vous soyez conscient, cela ne fonctionne pas avec boto3. J'ai contribué une suggestion ci-dessous comme une réponse différente.
fuzzygroup
2

Dans s3cmd, exécutez simplement la commande suivante (sur un système Ubuntu):

s3cmd ls -r s3://mybucket | wc -l
mjsa
la source
13
Pourquoi avez-vous ressuscité une question vieille de 5 ans pour publier une copie mal formatée d' une réponse existante ?
Two-Bit Alchemist
La réponse précédente a redirigé la sortie dans un fichier txt inutilement.
mjsa
10
OMI, cela devrait être un commentaire sur cette réponse, alors. C'est une différence vraiment insignifiante.
Two-Bit Alchemist
2
Cela semble être une réponse valable, d'autant plus que la réponse sélectionnée pour cette question commence par «Il n'y a pas moyen ...» et @mjsa a fourni une réponse en une ligne.
Nan
Ce n'est pas une bonne réponse car elle ne prend pas en compte les objets versionnés.
3h4x
2

Si vous utilisez l'AWS CLI sous Windows, vous pouvez utiliser le Measure-Objectde PowerShell pour obtenir le nombre total de fichiers, comme wc -lsur * nix.

PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object

Count    : 25
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

J'espère que ça aide.

pdm
la source
2

L'un des moyens les plus simples de compter le nombre d'objets dans s3 est:

Étape 1: Sélectionnez le dossier racine Étape 2: Cliquez sur Actions -> Supprimer (évidemment, faites attention à ne pas le supprimer) Étape 3: Attendez quelques minutes aws vous montrera le nombre d'objets et sa taille totale.

UpVote si vous trouvez la solution.

rohitcoder
la source
1

Aucune des API ne vous donnera un décompte car il n'y a vraiment pas d'API spécifique à Amazon pour le faire. Vous devez simplement exécuter une liste-contenu et compter le nombre de résultats renvoyés.

Mitch Dempsey
la source
Pour une raison quelconque, les librairies ruby ​​(right_aws / appoxy_aws) ne listeront pas plus que les 1000 premiers objets d'un bucket. Y en a-t-il d'autres qui listeront tous les objets?
champs
Lorsque vous demandez la liste, ils fournissent un champ "NextToken", que vous pouvez utiliser pour renvoyer la demande avec le jeton, et il en listera plus.
Mitch Dempsey
1

À partir de la ligne de commande dans AWS CLI, utilisez ls plus --summarize. Il vous donnera la liste de tous vos éléments et le nombre total de documents dans un compartiment particulier. Je n'ai pas essayé cela avec des seaux contenant des sous-seaux:

aws s3 ls "s3://MyBucket" --summarize

Cela prend un peu de temps (il a fallu environ 4 minutes pour lister mes documents 16 + K), mais c'est plus rapide que de compter 1K à la fois.

Ricardo
la source
0

3Hub est interrompu. Il existe une meilleure solution, vous pouvez utiliser Transmit (Mac uniquement), puis il vous suffit de vous connecter à votre bucket et de choisir Show Item Countdans le Viewmenu.

Arielcr
la source
La transmission ne montre malheureusement que jusqu'à 1000 articles (et le nombre d'articles est donc également maximal sur 1000)
Tino
0

Vous pouvez télécharger et installer le navigateur s3 à partir de http://s3browser.com/ . Lorsque vous sélectionnez un compartiment dans le coin central droit, vous pouvez voir le nombre de fichiers dans le compartiment. Mais la taille affichée est incorrecte dans la version actuelle.

Gubs

gubs
la source
0

Le moyen le plus simple est d'utiliser la console développeur, par exemple, si vous êtes sur chrome, choisissez Outils de développement, et vous pouvez voir ce qui suit, vous pouvez soit trouver et compter, soit faire une correspondance, comme 280-279 + 1 = 2

...

zeroc00l
la source
Pourriez-vous s'il vous plaît ajouter des détails sur la façon dont vous avez utilisé les outils de développement pour déterminer le nombre total d'objets dans un compartiment.
Jugal Panchal
0

Vous pouvez potentiellement utiliser l'inventaire Amazon S3 qui vous donnera la liste des objets dans un fichier csv

Vivek
la source
0

J'ai trouvé l'outil de navigateur S3 très utilisateur, il fournit des fichiers et des dossiers et le nombre total ainsi que la taille de tout dossier de manière récursive

Lien de téléchargement: https://s3browser.com/download.aspx

Vishal Zanzrukia
la source
0

Peut également être fait avec gsutil du(Oui, un outil Google Cloud)

gsutil du s3://mybucket/ | wc -l
Ghilas BELHADJ
la source
0

Vous pouvez simplement exécuter cette commande cli pour obtenir le nombre total de fichiers dans le compartiment ou dans un dossier spécifique

Analyser le seau entier

aws s3api list-objects-v2 --bucket testbucket | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME | grep "Key" | wc -l

vous pouvez utiliser cette commande pour obtenir des détails

aws s3api list-objects-v2 --bucket BUCKET_NAME

Analyser un dossier spécifique

aws s3api list-objects-v2 --bucket testbucket --prefix testfolder --start-after testfolder/ | grep "Key" | wc -l

aws s3api list-objects-v2 --bucket BUCKET_NAME --prefix FOLDER_NAME --start-after FOLDER_NAME/ | grep "Key" | wc -l
Indunil Asanka
la source
0

Si vous recherchez des fichiers spécifiques, disons des .jpgimages, vous pouvez effectuer les opérations suivantes:

aws s3 ls s3://your_bucket | grep jpg | wc -l
tsveti_iko
la source
0

Voici comment vous pouvez le faire en utilisant le client java.

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.519</version>
</dependency>
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectListing;

public class AmazonS3Service {

    private static final String S3_ACCESS_KEY_ID = "ACCESS_KEY";
    private static final String S3_SECRET_KEY = "SECRET_KEY";
    private static final String S3_ENDPOINT = "S3_URL";

    private AmazonS3 amazonS3;

    public AmazonS3Service() {
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setProtocol(Protocol.HTTPS);
        clientConfiguration.setSignerOverride("S3SignerType");
        BasicAWSCredentials credentials = new BasicAWSCredentials(S3_ACCESS_KEY_ID, S3_SECRET_KEY);
        AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
        AmazonS3ClientBuilder.EndpointConfiguration endpointConfiguration = new AmazonS3ClientBuilder.EndpointConfiguration(S3_ENDPOINT, null);
        amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(credentialsProvider).withClientConfiguration(clientConfiguration)
                .withPathStyleAccessEnabled(true).withEndpointConfiguration(endpointConfiguration).build();
    }

    public int countObjects(String bucketName) {
        int count = 0;
        ObjectListing objectListing = amazonS3.listObjects(bucketName);
        int currentBatchCount = objectListing.getObjectSummaries().size();
        while (currentBatchCount != 0) {
            count += currentBatchCount;
            objectListing = amazonS3.listNextBatchOfObjects(objectListing);
            currentBatchCount = objectListing.getObjectSummaries().size();
        }
        return count;
    }
}
Rakesh
la source
0

Voici la version boto3 du script python intégré ci-dessus.

import sys
import boto3

s3 = boto3.resource('s3')
s3bucket = s3.Bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.objects.all():
    totalCount += 1
    size += key.size

print('total size:')
print("%.3f GB" % (size*1.0/1024/1024/1024))
print('total count:')
print(totalCount)`
groupe flou
la source
0

aws s3 ls s3: // nom-compartiment / préfixe-dossier-s'il-y-a-un --recursive | wc -l

MayurSatpute
la source
Cela fonctionne pour plus de 1000, il en comptait 4258 pour moi
KingAndrew
Les lignes ne correspondent pas directement au nombre de fichiers. Parce qu'ils ont aussi une ligne entière juste pour la date et le répertoire.
CMCDragonkai
La commande fonctionne pour un nombre limité de fichiers. Dans mon cas, le nombre de fichiers est supérieur à un million et cela ne donne jamais de résultat. Mais c'est une bonne option pour les fichiers limités.
Jugal Panchal le