2017-11-10 1 views
0

Ich schreibe eine AWS Lambda-Funktion, die 100.000 Objekte pro Lambda-Funktionsaufruf aus S3-Bucket löscht. Ich versuche zu sehen, ob ich die Löschung auf einem Hintergrundthreads verursachen und laufen lassen kann. Ich habe den folgenden Code.AWS Lambda mehrere Threads und boto3

import boto3 
import boto3.session 
from threading import Thread 

http_response = [] 
MAX = 999 
threads = [] 

class myThread(Thread): 
    def __init__(self, objects_to_delete, bucket_name): 
    Thread.__init__(self) 

    self.objects_to_delete = objects_to_delete 
    self.bucket_name = bucket_name 

    def run(self): 
    session = boto3.session.Session().client('s3') 
    s3 = session.client('s3') 

    #### 
    COMES HERE AND PRINTS THE NAME OF THE BUCKET. 
    #### 
    print(self.bucket_name) 

    response = s3.delete_objects(Bucket=bucket_name, Delete={'Objects': objects_to_delete[0:MAX] }) 

    #### 
     THIS IS NOT GETTING PRINTED. MEANING, delete_object IS BREAKING/NOT EXECUTING 
    #### 
    print(response) 


def handler(event, context): 

    keys = event['keys'] 
    bucket_name = event["bucket"] 

    if (len(keys) == 0 or len(bucket_name) == 0): 
    return { 
     "message": http_response 
    } 

try: 
     t = myThread(objects_to_delete[0:MAX], bucket_name) 
     t.start() 
     threads.append(t) 

except: 
    print("Something Went wrong!!! " + str(objects_to_delete)) 


del keys[0:MAX] 

for i in range(len(threads)): 
    threads[i].start() 


handler({'keys': keys, 'bucket': bucket_name}, context) 

Gibt es etwas falsch, was ich hier mache? Es scheint so, als ob der Thread gestartet wird, es wird jedoch kein "delete_objects" -Aufruf ausgeführt. Es werden nicht einmal Fehlermeldungen ausgegeben, um den Fehler zu erfahren. Irgendwelche Gedanken oder Ideen?

Noch eine Sache, wenn ich diese Funktion lokal auf meinem Computer ausführen, läuft es problemlos ohne Probleme.

+0

Warum verwenden Sie Threading? Sie können bis zu 1000 Schlüssel auf einmal löschen, und Sie machen eine einzige Anforderung, um 999 zu löschen. Wenn Sie mehr löschen, sehe ich keine Iterationslogik oder den Boto3-Paginator. –

+0

Entschuldigung, ich werde bis zu 100, 000 löschen Objekte für jeden Lambda-Funktionsaufruf. – Harish

+1

Randbemerkung: Eine effiziente Methode zum Löschen vieler Objekte aus Amazon S3 besteht in der Verwendung einer Lebenszyklusregel, die für einen bestimmten Pfad gilt. Löschungen sind nicht sofort, aber sie werden kostenlos durchgeführt. –

Antwort

0

stellt sich heraus, nachdem Sie einen Thread gestartet haben, sollten Sie sich ihnen anschließen, denn sobald der Prozess beendet wird, sterben auch die Threads. So tat ich folgendes

import boto3 
from threading import Thread 

MAX = 999 
threads = [] 

class myThread(Thread): 
    def __init__(self, bucket_name, objects): 
     Thread.__init__(self) 
     self.bucket_name = bucket_name 
     self.objects = objects 

def run(self): 
    s3 = boto3.client('s3', region_name="us-east-1") 
    response = s3.delete_objects(Bucket=self.bucket_name, Delete={'Objects':self.objects}) 
    print(response) 


def handler(event, context): 

    keys = event["keys"] 
    bucket_name = event["bucket"] 

    objects_to_delete = [1...100,000] 

    while (len(objects_to_delete) != 0): 
     t = myThread(bucket_name, objects_to_delete[0:MAX]) 
     threads.append(t) 
     del objects_to_delete[0:MAX] 


    for thread in threads: 
     thread.start() 

    for thread in threads: 
     thread.join() 

    return { 
     "message": "Success Message." 
    }