2017-10-18 22 views
-1

Mon installation AWS actuelle est une fonction lambda qui est déclenchée chaque fois que je place un objet dans un compartiment S3. J'ai implémenté la fonction de gestionnaire de lambda en Java. Ce que je veux faire, c'est simplement accéder au fichier qui a été téléchargé et déclencher l'exécution de la fonction lambda. Par exemple, si je télécharge sample.json dans le compartiment, je veux accéder au contenu de ce fichier dans ma fonction gestionnaire.Comment lire le fichier téléchargé qui a directement déclenché l'exécution de lambda?

Je sais que je peux faire quelque chose comme ceci:

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... 
     } 
// ... 

Le problème est que je ne suis pas autorisé à utiliser les touches d'accès. Ainsi, je ne peux pas créer un s3Client pour télécharger le fichier avec. En d'autres termes, je dois obtenir l'objet de l'argument que ma méthode de gestionnaire prend, c'est-à-dire, S3Event input. Comment ferais-je cela?

+0

Lambda n'a pas besoin de clés d'accès à utiliser S3. – dashmug

+0

@dashmug J'ai pensé que. Mais comment puis-je lire le fichier? Puis-je l'obtenir depuis 'S3Event input'? –

+0

's3Client.getObject (new GetObjectRequest (bucket, key));' semble être une bonne approche. Qu'est-ce qui ne va pas avec ça? – cy3er

Répondre

1

Si votre fonction Lambda est configurée avec un rôle IAM approprié (qui autorise s3: GetObject de l'objet S3 correspondant), vous n'avez pas besoin de fournir explicitement des informations d'identification dans votre code.

est ici un exemple de code Java pour obtenir un objet en réponse à un objet téléchargé événement Lambda:

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"; 
     } 
    } 
}