2016-04-19 9 views
1

Hat jemand erfolgreich einen Java-basierten Anforderungshandler für S3-Ereignisse implementiert?AWS Lambda S3Event-Deserialisierung

Meine Klasse:

package example; 

import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.RequestHandler; 
import com.amazonaws.services.s3.model.S3Event; 

public class Hello implements RequestHandler<S3Event, String> { 
    public String handleRequest(S3Event event, Context context) { 
     return "Success"; 
    } 
} 

Fehlermeldung: java.lang.RuntimeException java.lang.RuntimeException:

Fehler beim Parsen von JSON ist ein Fehler aufgetreten während JSON Parsen aufgetreten Verursacht durch: java .io.UncheckedIOException: com.fasterxml.jackson.databind.JsonMappingException: Die Instanz von com.amazonaws.services.s3.model.S3Event kann nicht aus dem START_OBJECT-Token bei [Quelle: [email protected]; Zeile: 1, Spalte: 1] Verursacht von: com.fasterxml.jackson.databind.JsonMappingException: Die Instanz von com.amazonaws.services.s3.model.S3Event kann nicht aus dem START_OBJECT-Token bei [Quelle: lambdainternal.util.NativeMemoryAsInputStream @ 6108b2d7; Zeile: 1, Spalte: 1] unter com.fasterxml.jackson.databind.JsonMappingException.from (JsonMappingException.java:148) unter com.fasterxml.jackson.databind.DeserializationContext.mappingException (DeserializationContext.java:835) unter com.fasterxml .jackson.databind.DeserializationContext.mappingException (DeserializationContext.java:831) unter com.fasterxml.jackson.databind.deser.std.EnumDeserializer._deserializeOther (EnumDeserializer.java:137) unter com.fasterxml.jackson.databind.deser.std .EnumDeserializer.deserialize (EnumDeserializer.java:89) unter com.fasterxml.jackson.databind.deser.std.EnumDeserializer.deserialize (EnumDeserializer.java:18) unter com.fasterxml.jackson.databind.ObjectReader._bindAndClose (ObjectReader.java : 1441) bei com.fasterxml.jackson.databind.ObjectReader.readValue (ObjectReader.java:1047)

+0

Haben Sie die Lambda-Funktion konfiguriert, um direkt vom S3-Bucket benachrichtigt zu werden? Wenn SNS "in der Mitte" konfiguriert ist, kann dies den angezeigten Fehler verursachen, da die JSON-Nutzdaten nicht übereinstimmen. – JaredHatfield

Antwort

6

Die Lösung war, S3EventNotification zu nehmen. Wünsche, dass dies in der AWS-Dokumentation behandelt wurde. Ich mag das Lambda-Konzept, aber es gibt nicht viel für Dokumentation oder Beispiele da draußen.

public void mergeGLAU(S3EventNotification notification, Context context) { 
    try { 
     for (S3EventNotificationRecord record : notification.getRecords()) { 
      System.out.println(record.getEventSource()); 
      System.out.println(record.getEventName()); 
      System.out.println(record.getS3().getBucket().getName()); 
      System.out.println(record.getS3().getObject().getKey()); 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
}