0

Ich hatte this example verfolgt und leicht verändert, aber es funktionierte lange Zeit sehr gut. Ich benutzte ausschließlich PNG-Dateien als Eingabe, und alles hatte funktioniert. Ich habe kürzlich versucht, JPG-Bilder (aufgrund einiger Beschränkungen von PNG-Bildern bis zur vertikalen/horizontalen Ausrichtung) als Eingabe zu verwenden, und ich habe die Lambda-Funktion von AWS CLI invoke getestet und es funktioniert.AWS Lambda hängt unbestimmt beim Erstellen von Thumbnails von jpg-Dateien

Wenn ich versuche, die gleiche Testdatei von der Website (jpg) hochzuladen, bleibt die s3-Anfrage auf unbestimmte Zeit hängen und der Client dreht sich ohne Antwort von s3. Ich kann sehen, die Originaldatei in den Haupt-Bucket erfolgreich hochgeladen, aber die Thumbnails werden nie erstellt, und keine Aufzeichnung ist jemals in der CloudWatch Log protokolliert. Auch hier gibt der Test mit der Funktion invoke den Code 202 zurück und erstellt erfolgreich die Thumbnails. SO bin ich wirklich ratlos.

Auch alles funktioniert gut bei der Verwendung von PNG-Dateien, so scheint es etwas mit jpg-Unterstützung zu sein. Ich hatte angenommen, dass ich PIL ohne JPEG-Unterstützung installiert hatte, aber ich habe es getestet und mit JPG-Bildern mit der installierten Lambda-Funktion und AWS invoke getestet. Es macht mich wahnsinnig, weil alle Tests funktionieren, nur in der Produktion stirbt die Anfrage "leise" und lässt mich nicht mehr nach Fehlern suchen. Hier

ist die Lambda-Funktion:

from __future__ import print_function 
import boto3 
import os 
import sys 
import uuid 
from PIL import Image 
import PIL.Image 

s3_client = boto3.client('s3') 

def resize_image(image_path, resized_path, resized_width): 
    with Image.open(image_path) as image: 
     if image.size[0] > resized_width: 
      image.thumbnail((resized_width, image.size[1]/(image.size[0]/resized_width))) 
     image.save(resized_path) 

def handler(event, context): 
    for record in event['Records']: 
     bucket = record['s3']['bucket']['name'] 
     key = record['s3']['object']['key'] 
     download_path = '/tmp/{}{}'.format(uuid.uuid4(), key) 
     upload_path_small = '/tmp/resized_small-{}'.format(key) 
     upload_path_medium = '/tmp/resized_medium-{}'.format(key) 

     s3_client.download_file(bucket, key, download_path) 
     resize_image(download_path, upload_path_small, 600) 
     resize_image(download_path, upload_path_medium, 1200) 
     s3_client.upload_file(upload_path_small, '{}small'.format(bucket), key) 
     s3_client.upload_file(upload_path_medium, '{}medium'.format(bucket), key) 

Anyways verstehe ich, dass diese Frage für jeden schwierig sein wird, da draußen für mich zu beheben, aber wenn jemand irgendwelche Vorschläge, die sehr geschätzt werden würde. Vielen Dank!

UPDATE

Während also die Anfrage dort im Browser hing, herausgegeben ich den Eingang des manuellen invoke Funktion von der AWS CLI auf den Namen des neu Hauptbild hochgeladen jpg, und dass erstellt die Thumbnails und dann die Web-Anfrage im Browser plötzlich abgeschlossen und beantwortet. So ein seltsames Problem.

SCHLIESSUNG

Für alle, die diesen ganzen Beitrag zu lesen waren nett genug, ich habe das Problem erkannt haben, wie John Rotenstein in seinem Kommentar zu empfehlen, überprüfte ich die S3 Ereignis, das die Lambda-Funktion auslöst , die ich irgendwie vergessen hatte. Ich hatte es ursprünglich nur für png-Dateien ausgelöst. Das war also das ganze Problem. Erklärt, warum CloudWatch nicht angemeldet war.

+1

Als erstes muss überprüft werden, ob Amazon S3 die Lambda-Funktion korrekt auslöst. Wenn dies der Fall ist, sollten Sie es auf der Registerkarte Überwachung der Lambda-Konsole und in CloudWatch-Logs sehen. Wenn sie keinen Aufruf der Funktion anzeigen, müssen Sie dies untersuchen. Überprüfen Sie, ob Sie "Trigger aktivieren" für den S3-Trigger aktiviert haben und dass der ** Event-Typ ** "Objekt erstellt (alle)" ist. –

+0

Das ist es, du hast es!Ich hatte den Filter ursprünglich so eingerichtet, dass er nur auf 'png'-Dateien triggert ... Vielen Dank. Sollte das gewusst haben. –

Antwort

1

Die erste Frage ist, ob Amazon S3 die Lambda-Funktion korrekt auslöst. Wenn dies der Fall ist, sollten Sie es auf der Registerkarte Überwachung der Lambda-Konsole und in CloudWatch-Logs sehen.

Wenn sie keinen Aufruf der Funktion anzeigen, müssen Sie dies untersuchen. Überprüfen Sie, ob Sie "Trigger aktivieren" für den S3-Trigger aktiviert haben und dass der Event-TypObject Created (All) ist.

Verwandte Themen