2015-06-04 85 views
18

我想知道是否可以爲AWS設置一個lambda函數,只要將新文本文件上傳到s3存儲桶中就會觸發它。在函數中,我想獲取文本文件的內容並以某種方式處理它。我想知道這是否可能...?如何使用lambda函數從AWS s3獲取文本文件的內容?

例如,如果我上傳foo.txt,內容爲foobarbaz,我想以某種方式在我的lambda函數中獲得foobarbaz,所以我可以用它做東西。我知道我可以從getObject或類似的方法獲取元數據。

謝謝!

回答

20

是的,你可以做到這一點。如果您閱讀Lambda programming docs,您將看到S3對象密鑰(和存儲桶名稱)通過參數事件傳遞到您的Lambda函數。然後,您可以從S3獲取對象,閱讀其內容,然後執行您需要的任何操作。 BTW對象的內容不是元數據;它是數據。

原來的例子是通過PDF在wayback machine現已推出,但基本的代碼從拉姆達event檢索桶和對象主要內容如下:

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

一旦你的水桶和關鍵,你可以調用的getObject檢索對象,這裏是一個更完整的示例,說明如何做到這一點:

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

一些海報,已要求在Java中的等價物,所以這裏有一個例子:

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

對,但除非我錯了,不是'console.log('CONTENT TYPE:',data.ContentType);'元數據而不是文件的內容中的數據? – jstnchng

+0

它給你的事件數據,但不是文件本身的數據,iirc。 – jstnchng

+0

@jstnchng是的,這是元數據。但我認爲你要求的是'foobarbaz'這是實際的S3對象的內容,所以你必須調用GetObject來檢索對象。 – jarmod

12

您可以使用data.Body.toString('ascii')來獲取文本文件的內容,假定文本文件使用ascii格式編碼。您也可以將其他編碼類型傳遞給該函數。查看Node-Buffer瞭解更多詳情。

+0

工程就像一個魅力,順便說一句,你可以看看我的類似問題? http://stackoverflow.com/questions/34056133/append-string-to-a-text-file-nodejs-in-aws-lambda – Casper

+0

這應該是公認的答案imho –

相關問題