2015-06-04 14 views
18

Zastanawiam się, czy mogę skonfigurować funkcję lambda dla AWS, uruchamianą za każdym razem, gdy nowy plik tekstowy zostanie załadowany do wiadra s3. W funkcji chciałbym uzyskać zawartość pliku tekstowego i przetworzyć go w jakiś sposób. Zastanawiałem się, czy to możliwe ...?Jak uzyskać zawartość pliku tekstowego z AWS s3 za pomocą funkcji lambda?

Na przykład, jeśli wyślę foo.txt, z zawartością foobarbaz, chciałbym jakoś dostać foobarbaz w mojej funkcji lambda, więc mogę zrobić z tym materiałem. Wiem, że mogę uzyskać metadane z getObject lub podobnej metody.

Dzięki!

Odpowiedz

20

Tak, możesz to zrobić. Jeśli przeczytasz Lambda programming docs, zobaczysz, że klucz obiektu S3 (i nazwa wiadra) są przekazywane do twojej funkcji Lambda za pomocą parametru event. Następnie możesz pobrać obiekt z S3, przeczytać jego zawartość, a następnie zrobić wszystko, co musisz zrobić. BTW treść obiektu nie jest metadata; to dane.

Original przykładem jest obecnie dostępna za pośrednictwem PDF na wayback machine, ale podstawowy kod do pobierania wiadro i obiektów kluczyk ze Lambda event jest następujący:

exports.handler = function(event, context, callback) { 
    var src_bkt = event.Records[0].s3.bucket.name; 
    var src_key = event.Records[0].s3.object.key; 
}; 

Gdy masz wiadro i klucz, można zadzwonić getObject do odebrania obiektu, a tutaj jest bardziej kompletny przykład, który pokazuje, jak to zrobić:

var AWS = require('aws-sdk'); 
var s3 = new AWS.S3(); 

exports.handler = function(event, context, callback) { 

    // Retrieve the bucket & key for the uploaded S3 object that 
    // caused this Lambda function to be triggered 
    var src_bkt = event.Records[0].s3.bucket.name; 
    var src_key = event.Records[0].s3.object.key; 

    // Retrieve the object 
    s3.getObject({ 
     Bucket: src_bkt, 
     Key: src_key 
    }, function(err, data) { 
     if (err) { 
      console.log(err, err.stack); 
      callback(err); 
     } else { 
      console.log("Raw text:\n" + data.Body.toString('ascii')); 
      callback(null, null); 
     } 
    }); 
}; 

szereg plakatów prosić o równowartości w Javie, więc oto przykład:

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.AmazonS3Client; 
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 = new AmazonS3Client(); 
      String body = s3Client.getObjectAsString(bkt, key); 
      System.out.println("Body: " + body); 
      return "ok"; 
     } catch (Exception e) { 
      System.err.println("Exception: " + e); 
      return "error"; 
     } 
    } 
} 
+0

Dobrze, ale jeśli się nie mylę, to nie jest "data" w 'console.log (" CONTENT TYPE: ', data.ContentType); 'metadane zamiast zawartości pliku? – jstnchng

+0

Daje dane zdarzeń, ale nie dane samego pliku, iirc. – jstnchng

+0

@jstnchng Tak, to metadane. Ale myślę, że prosiłeś o "foobarbaz", który jest treścią rzeczywistego obiektu S3, więc musiałbyś wezwać GetObject do pobrania obiektu. – jarmod

12

Można użyć data.Body.toString('ascii') aby uzyskać zawartość pliku tekstowego, zakładając, że plik tekstowy został zakodowany używane formacie ASCII. Można także przekazać inne funkcje kodowania do tej funkcji. Aby uzyskać więcej informacji, sprawdź numer Node-Buffer.

+0

Działa jak urok, btw możesz rzucić okiem na moje podobne pytanie? http://stackoverflow.com/questions/34056133/append-string-to-a-text-file-nodejs-in-aws-lambda – Casper

+0

powinno to być zaakceptowaną odpowiedzią imho –