2017-10-18 4 views
-1

Mein aktuelles AWS-Setup ist eine Lambda-Funktion, die ausgelöst wird, wenn ich ein Objekt in einen S3-Bucket setze. Ich habe die Handler-Funktion von Lambda in Java implementiert. Ich möchte einfach auf die hochgeladene Datei zugreifen und die Ausführung der Lambda-Funktion auslösen. Zum Beispiel, wenn ich in den Bucket hochlade, möchte ich auf den Inhalt dieser Datei in meiner Handler-Funktion zugreifen.Wie kann ich die hochgeladene Datei lesen, die die Lambda-Ausführung direkt ausgelöst hat?

Ich weiß, dass ich etwas tun kann:

public Void handleRequest(S3Event input, Context context) { 
    for (S3EventNotificationRecord record : input.getRecords()) { 
    String key = record.getS3().getObject().getKey(); 
    String bucket = record.getS3().getBucket().getName(); 
    AmazonS3 s3Client = new AmazonS3Client(credentials); 
    try { 
     S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucket, key)); 
     InputStream input = s3Object.getObjectContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
     while (true) { 
     String line = reader.readLine(); 
     if (line == null) break; 
     // Do something with line... 
     } 
// ... 

Das Problem ist, dass ich nicht Zugriffsschlüssel zu verwenden, ist erlaubt. Daher kann ich keine s3Client erstellen, um die Datei mit herunterzuladen. Mit anderen Worten, ich muss das Objekt von dem Argument erhalten, das meine Handler-Methode annimmt, d. H. S3Event input. Wie würde ich das tun?

+0

Lambda nicht Zugriffstasten benötigen S3 zu verwenden. – dashmug

+0

@dashmug Ich dachte mir das aus. Aber wie lese ich die Datei? Kann ich es von 'S3Event input' bekommen? –

+0

's3Client.getObject (neues GetObjectRequest (bucket, key));' scheint ein guter Ansatz zu sein. Was stimmt damit nicht? – cy3er

Antwort

1

Wenn Ihre Lambda-Funktion mit einer geeigneten IAM-Rolle konfiguriert ist (die s3: GetObject des relevanten S3-Objekts ermöglicht), müssen Sie keine Anmeldeinformationen explizit in Ihrem Code angeben.

Hier Beispiel-Java-Code ein Objekt in Reaktion auf ein Objekt hochgeladen Lambda Ereignis zu erhalten:

package example; 

import java.net.URLDecoder; 

import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.RequestHandler; 
import com.amazonaws.services.lambda.runtime.events.S3Event; 
import com.amazonaws.services.s3.AmazonS3; 
import com.amazonaws.services.s3.AmazonS3ClientBuilder; 
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord; 

public class S3GetTextBody implements RequestHandler<S3Event, String> { 

    public String handleRequest(S3Event s3event, Context context) { 
     try { 
      S3EventNotificationRecord record = s3event.getRecords().get(0); 

      // Retrieve the bucket & key for the uploaded S3 object that 
      // caused this Lambda function to be triggered 
      String bkt = record.getS3().getBucket().getName(); 
      String key = record.getS3().getObject().getKey().replace('+', ' '); 
      key = URLDecoder.decode(key, "UTF-8"); 

      // Read the source file as text 
      AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); 
      String body = s3Client.getObjectAsString(bkt, key); 
      System.out.println("Body: " + body); 
      return "ok"; 
     } catch (Exception e) { 
      System.err.println("Exception: " + e); 
      return "error"; 
     } 
    } 
} 
Verwandte Themen