Question Le moyen le plus efficace de supprimer par lots les fichiers S3


J'aimerais pouvoir supprimer par lots des milliers, voire des dizaines de milliers de fichiers à la fois sur S3. Chaque fichier serait entre 1 Mo et 50 Mo. Naturellement, je ne veux pas que l'utilisateur (ou mon serveur) soit en attente pendant que les fichiers sont en train d'être supprimés. D'où les questions:

  1. Comment S3 gère-t-il la suppression de fichiers, en particulier lors de la suppression d'un grand nombre de fichiers?
  2. Existe-t-il un moyen efficace de faire cela et de faire en sorte qu'AWS fasse l'essentiel du travail? Par efficace, j'entends par faire le moins de demandes à S3 et le moins de temps possible, en utilisant le moins de ressources sur mes serveurs.

6
2018-04-02 04:06


origine




Réponses:


AWS prend en charge la suppression en masse d'un maximum de 1 000 objets par requête à l'aide de l'API REST S3 et de ses divers wrappers. Cette méthode suppose que vous connaissiez les clés d'objet S3 que vous souhaitez supprimer (en d'autres termes, elle n'est pas conçue pour gérer des éléments tels qu'une stratégie de rétention, des fichiers d'une taille supérieure, etc.).

L'API REST S3 peut spécifier jusqu'à 1 000 fichiers à supprimer en une seule demande, ce qui est plus rapide que de créer des demandes individuelles. N'oubliez pas que chaque requête est une requête HTTP (donc TCP). Donc, chaque demande entraîne des frais généraux. Vous devez simplement connaître les clés des objets et créer une requête HTTP (ou utiliser un wrapper dans la langue de votre choix). AWS fournit d'excellentes informations sur cette fonctionnalité et son utilisation.. Il suffit de choisir la méthode avec laquelle vous êtes le plus à l'aise!

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 images" ou "purger tous les fichiers d'une date antérieure à une certaine date" (qui, à mon avis, est facile à configurer séparément dans S3).

Si tel est le cas, vous saurez quelles sont les clés à supprimer. Cela signifie également que l'utilisateur voudra avoir plus d'informations en temps réel sur le fait que son fichier a été supprimé avec succès ou non. 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é le traitement d’une très grande quantité de données.

Sinon, vous pouvez examiner les appels d'API asynchrones. Vous pouvez en apprendre un peu plus sur leur fonctionnement en général article de blog ou cherchez comment le faire dans la langue de votre choix. Cela permettrait à la demande de suppression de créer 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 gênant) ou votre environnement (vous auriez besoin d'un service / d'un démon / d'un conteneur / d'un 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 le s3 faq commente que la suppression de masse est la voie à suivre si possible.


7
2018-04-02 19:27





J'étais frustré par les performances de la console Web pour cette tâche. J'ai trouvé que le AWS CLI la commande le fait bien. Par exemple:

aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files

Pour une grande hiérarchie de fichiers, cela peut prendre un temps considérable. Vous pouvez définir cette course dans un tmux ou screen session et revenez plus tard.


3
2017-08-09 19:01



Il ressemble à la aws s3 rm --recursive Cette commande supprime les fichiers individuellement. Bien que plus rapide que la console Web, lors de la suppression de nombreux fichiers, il pourrait être beaucoup plus rapide s'il était supprimé en bloc - Brandon


le incroyablement lent l'option est s3 rm --recursive si vous aimez réellement attendre.

En cours d'exécution parallèle s3 rm --recursive avec différent --include Patterns est légèrement plus rapide, mais il faut encore attendre beaucoup de temps, chaque processus récupérant individuellement la liste complète des clés afin d'effectuer localement la tâche. --include correspondance de modèle.

Entrez la suppression en masse.

J'ai trouvé que j'étais capable d'obtenir le plus de vitesse en supprimant 1000 clés à la fois en utilisant aws s3api delete-objects.

Voici un exemple:

cat file-of-keys | xargs -P8 -n1000 bash -c 'aws s3api delete-objects --bucket MY_BUCKET_NAME --delete "Objects=[$(printf "{Key=%s}," "$@")],Quiet=true"' _
  • le -P8 option sur xargs contrôle le parallélisme. C'est huit dans ce cas, ce qui signifie 8 instances de 1000 suppressions à la fois.
  • le -n1000 l'option dit xargs pour grouper 1000 clés pour chaque aws s3api delete-objects appel.
  • Enlever ,Quiet=true ou le changer pour false va cracher les réponses du serveur.
  • Remarque: il y a un facile à manquer _ à la fin de cette ligne de commande. @VladNikiforov a posté un excellent commentaire de ce qu'il est dans le commentaire donc je vais juste faire un lien vers ça.

Mais comment obtenez-vous file-of-keys?

Si vous avez déjà votre liste de clés, tant mieux. Travail terminé.

Si non, voici une solution, je suppose:

aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | sed -nre "s|[0-9-]+ [0-9:]+ +[0-9]+ |SOME_SUB_DIR|p" >file-of-keys

2
2018-06-22 06:38



Excellente approche, mais j'ai trouvé que la liste des clés était le goulot d'étranglement. C'est beaucoup plus rapide: aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys  Et ensuite, en supprimant les objets (cela suffisait pour que le dépassement d'un processus parallèle atteigne les limites de taux de suppression d'objet): 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"' _ - SEK
Vous auriez probablement aussi dû souligner l’importance de _ à la fin :) je l’ai manquée et puis il m’a fallu un bon bout de temps pour comprendre pourquoi le premier élément est sauté. Le fait est que bash -c passe tous les arguments comme paramètres de position, en commençant par $0, tandis que "$ @" ne traite que les paramètres commençant par $1. Donc, le mannequin de soulignement est nécessaire pour combler le poste de $0. - Vlad Nikiforov
@VladNikiforov Cheers, édité. - antak


Sans savoir comment vous gérez les compartiments s3, cela peut ne pas être particulièrement utile.

Les outils de l'AWS CLI disposent d'une option appelée "sync" qui peut être particulièrement efficace pour garantir que s3 dispose des objets appropriés. Si vous, ou vos utilisateurs, gérez S3 à partir d'un système de fichiers local, vous pourrez peut-être sauvegarder une tonne de travail en déterminant quels objets doivent être supprimés à l'aide des outils de la CLI.

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html


0
2018-04-02 19:42