À moins que quelque chose ne m'échappe, il semble qu'aucune des API que j'ai examinées ne permette de savoir combien d'objets se trouvent dans un fichier <S3 bucket>/<folder>
. Existe-t-il un moyen d'obtenir un décompte ?
Réponses
Trop de publicités?Je cherche la réponse à cette question, mais je viens de la trouver. Je voulais compter les fichiers en utilisant un outil basé sur l'interface graphique (c'est-à-dire sans code). Il se trouve que j'utilise déjà un outil appelé 3Hub pour les transferts par glisser-déposer depuis et vers S3. Je voulais savoir combien de fichiers j'avais dans un seau particulier (Je ne pense pas que la facturation soit ventilée par seaux).
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.
J'ai utilisé le script python script de scalablelogic.com (en ajoutant l'enregistrement du comptage). Cela 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
Le problème mentionné par @Mayank Jaiswal concernant l'utilisation des métriques cloudwatch ne devrait pas être un problème. Si vous n'obtenez pas de résultats, c'est que votre plage n'est peut-être pas assez large. Nous sommes le 3 novembre et je n'ai pas obtenu de résultats quoi que j'aie essayé. Je suis allé dans le seau s3 et j'ai regardé les comptes et le dernier enregistrement pour le compte "Nombre total d'objets" était le 1er novembre.
Voici donc à quoi ressemble la solution cloudwatch en utilisant javascript aws-sdk :
import aws from 'aws-sdk';
import { startOfMonth } from 'date-fns';
const region = 'us-east-1';
const profile = 'default';
const credentials = new aws.SharedIniFileCredentials({ profile });
aws.config.update({ region, credentials });
export const main = async () => {
const cw = new aws.CloudWatch();
const bucket_name = 'MY_BUCKET_NAME';
const end = new Date();
const start = startOfMonth(end);
const results = await cw
.getMetricStatistics({
// @ts-ignore
Namespace: 'AWS/S3',
MetricName: 'NumberOfObjects',
Period: 3600 * 24,
StartTime: start.toISOString(),
EndTime: end.toISOString(),
Statistics: ['Average'],
Dimensions: [
{ Name: 'BucketName', Value: bucket_name },
{ Name: 'StorageType', Value: 'AllStorageTypes' },
],
Unit: 'Count',
})
.promise();
console.log({ results });
};
main()
.then(() => console.log('Done.'))
.catch((err) => console.error(err));
Remarquez deux choses :
- Le début de la plage est fixé au début du mois.
- La période est fixée à un jour. Si elle est inférieure, vous risquez d'obtenir un message d'erreur indiquant que vous avez demandé trop de points de données.
Voici la version boto3 du script python script 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)