[PYTHON] Supprimez 1 000 objets stockés dans AWS S3 à la fois.

Chose que tu veux faire

Je souhaite pouvoir supprimer en lisant simplement le fichier contenant le nom de clé de l'objet à supprimer et en l'exécutant en un clic.

politique

-Préparer un fichier dans lequel la clé de l'objet à supprimer est écrite. -Utilisez l'API S3 (delete_objects) pour spécifier et supprimer la clé pendant la boucle.

Lien de référence ・ À propos de la suppression de S3

Ce que j'ai fait

-Créer une liste clé des objets à supprimer.

Liste clé des objets à supprimer


hoge/fuga/hoge.jpg
hoge/fuga/hoge.png
hoge/hoge/hoge.gif
hoge/hoge/fuga.png
・ ・ ・
fuga/fuga/fuga.png

-Exécuter le programme de suppression Étant donné que delete_objects ne peut spécifier que 1000 éléments à la fois, la liste des clés de lecture est subdivisée en 1000 éléments. Appuyez sur l'API DELETE dans les unités divisées pour exécuter la boucle.

Supprimer le programme.py



import boto3
import re
import json

MY_REGION = 'Nom de la région';
MY_BUCKET = 'Nom du godet';

client = boto3.client('s3', region_name=MY_REGION)
request_list = []
img_path_list = ''

def split_list(l):
    for idx in range(0, len(l), 1000):
        yield l[idx:idx + 1000]

#Lire les données supprimées
with open('Liste clé des objets à supprimer.text') as f:
    img_path_list = f.readlines()

#Supprimez le saut de ligne à la fin des données et ajoutez-le à la liste
for path in img_path_list:
    path = path.replace('\n','')
    request_list.append({'Key': path})

#Divisez la liste en 1000 éléments
# devide_list = [[0,...,999],[1000,...,1999],...,[n,...,n+999]]
devide_list = list(split_list(request_list))

#Exécutez l'API DELETE
for key_list in devide_list:
    response = client.delete_objects(
        Bucket = MY_BUCKET,
        Delete = {
            'Objects': key_list
        }
    )

    #Enregistrez le résultat de la suppression
    with open('log/Résultat de la suppression.txt', mode='a') as f:
        for res in response['Deleted']:
            f.write(json.dumps(res))
            f.write('\n')

-Si la suppression est réussie, le résultat sera le suivant.

Résultat de la suppression.text


{"Key": "hoge/fuga/hoge.jpg ", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge1"}
{"Key": "hoge/fuga/hoge.png ", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge2"}
{"Key": "hoge/hoge/hoge.gif", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge3"}
{"Key": "hoge/hoge/fuga.png ", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge4"}
{"Key": "fuga/fuga/fuga.png ", "DeleteMarker": true, "DeleteMarkerVersionId": "hogehoge5"}

Autre

Préparez une liste à supprimer et une liste à ne pas supprimer et vérifiez s'il existe une clé dans les deux listes.

Afficher les éléments présents dans les deux listes.py


input_urls = ''
not_delete_urls = ''

#Lire les données de la liste
with open('Liste d'entrée.txt') as f:
    input_urls = f.readlines();

with open('Liste à ne pas supprimer.txt') as f:
    not_delete_urls = f.readlines();

duplicate_urls = set(input_urls) & set(not_delete_urls)

#Passer du type d'ensemble au type de liste
list_duplicate_urls = list(duplicate_urls)
list_duplicate_urls.sort()

#Afficher le nombre d'éléments communs et d'éléments
print(len(list_duplicate_urls))
for elem in list_duplicate_urls:
    print(elem, end='')

Précautions

Recommended Posts

Supprimez 1 000 objets stockés dans AWS S3 à la fois.
Je voulais supprimer plusieurs objets en s3 avec boto3
J'ai arrêté une instance à un moment précis à l'aide d'AWS Lambda
Obtenez une instance datetime à tout moment de la journée en Python
J'ai créé un nouveau compartiment AWS S3
Transformez plusieurs listes avec l'instruction for en même temps en Python
Créez un environnement LAMP en très peu de temps
Recevoir et traiter n objets dans une liste
Supprimer des données dans un modèle avec Redis Cluster
Une manière intelligente de chronométrer le traitement avec Python
Boucle les variables en même temps dans le modèle