AWS prend en charge la suppression en masse d'un maximum de 1 000 objets par demande à l'aide de l'API S3 REST et de ses divers wrappers. Cette méthode suppose que vous connaissez les clés d'objet S3 que vous souhaitez supprimer (c'est-à-dire qu'elles ne sont pas conçues pour gérer quelque chose comme une politique de rétention, des fichiers dépassant une certaine taille, etc.).
L'API S3 REST peut spécifier jusqu'à 1 000 fichiers à supprimer en une seule demande, ce qui doit être plus rapide que d'effectuer des demandes individuelles. N'oubliez pas que chaque requête est une requête HTTP (donc TCP). Ainsi, chaque demande entraîne des frais généraux. Il vous suffit de connaître les clés des objets et de créer une requête HTTP (ou d'utiliser un wrapper dans la langue de votre choix). AWS fournit d'excellentes informations sur cette fonctionnalité et son utilisation . Choisissez simplement la méthode qui vous convient le mieux!
Je suppose que votre cas d'utilisation implique que les utilisateurs finaux spécifient un certain nombre de fichiers spécifiques à supprimer en même temps. Plutôt que de lancer une tâche telle que "purger tous les objets qui font référence à des fichiers image" ou "purger tous les fichiers antérieurs à une certaine date" (ce qui, à mon avis, est facile à configurer séparément dans S3).
Si c'est le cas, vous saurez les clés que vous devez supprimer. Cela signifie également que l'utilisateur aimera plus de commentaires en temps réel sur la suppression ou non de son fichier. Les références aux clés exactes sont censées être très rapides, car S3 a été conçu pour évoluer efficacement malgré la gestion d'une très grande quantité de données.
Sinon, vous pouvez examiner les appels d'API asynchrones. Vous pouvez en savoir un peu plus sur leur fonctionnement en général dans cet article de blog ou rechercher comment le faire dans la langue de votre choix. Cela permettrait à la demande de suppression de prendre son propre thread, et le reste du code peut s'exécuter sans faire attendre un utilisateur. Ou, vous pouvez décharger la demande dans une file d'attente. . . Mais ces deux options compliquent inutilement votre code (le code asynchrone peut être ennuyeux) ou votre environnement (vous auriez besoin d'un service / démon / conteneur / serveur pour gérer la file d'attente. J'éviterais donc ce scénario si possible.
Edit: je n'ai pas la réputation de poster plus de 2 liens. Mais vous pouvez voir les commentaires d'Amazon sur le taux de demande et les performances ici: http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html Et la FAQ s3 commente que la suppression en bloc est le chemin à parcourir si possible.
aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys
Et puis supprimer des objets (cela suffisait pour que le fait de passer par 1 processus parallèle atteigne les limites de taux de suppression d'objets):tail -n+0 BUCKET.keys | pv -l | grep -v -e "'" | tr '\n' '\0' | xargs -0 -P1 -n1000 bash -c 'aws s3api delete-objects --bucket BUCKET --delete "Objects=[$(printf "{Key=%q}," "$@")],Quiet=true"' _
_
à la fin :) Je l'ai manqué, puis il m'a fallu un certain temps pour comprendre pourquoi le premier élément était ignoré. Le fait est quebash -c
tous les arguments passent en tant que paramètres positionnels, en commençant par$0
, tandis que «$ @» traite uniquement les paramètres commençant par$1
. Le mannequin de soulignement est donc nécessaire pour occuper le poste de$0
.split -l 1000
de diviser mon fichier de clés en 1000 lots de clés. Maintenant, pour chaque fichier, je peux lancer la commande de suppression, puis supprimer le fichier. Si quelque chose se passe mal, je peux continuer.aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'
serait plus simple et vous pouvez ajouter un| grep
pour filtrer cela à partir de là.J'ai été frustré par les performances de la console Web pour cette tâche. J'ai trouvé que la commande AWS CLI le faisait bien. Par exemple:
aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files
Pour une hiérarchie de fichiers volumineux, cela peut prendre un certain temps. Vous pouvez définir cette exécution dans une
tmux
ouscreen
session et revenez plus tard.la source
aws s3 rm --recursive
commande supprime les fichiers individuellement. Bien que plus rapide que la console Web, lors de la suppression de nombreux fichiers, elle pourrait être beaucoup plus rapide si elle était supprimée en masseUne astuce consiste à utiliser les règles de cycle de vie pour gérer la suppression pour vous. Vous pouvez mettre en file d'attente une règle pour supprimer le préfixe ou les objets que vous souhaitez et Amazon se chargera simplement de la suppression.
https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html
la source
Sans savoir comment vous gérez les compartiments s3, cela peut ou peut ne pas être particulièrement utile.
Les outils AWS CLI ont une option appelée "sync" qui peut être particulièrement efficace pour garantir que s3 a les bons objets. Si vous, ou vos utilisateurs, gérez S3 à partir d'un système de fichiers local, vous pourrez peut-être économiser une tonne de travail en déterminant les objets à supprimer à l'aide des outils CLI.
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
la source
Il est déjà fait mention de la
s3 sync
commande avant, mais sans exemple ni mot sur l'--delete
option.J'ai trouvé le moyen le plus rapide de supprimer le contenu du dossier dans le
S3
compartimentmy_bucket
en:la source