2015-06-04 18 views
18

Tôi đã tự hỏi nếu tôi có thể thiết lập một hàm lambda cho AWS, được kích hoạt bất cứ khi nào một tệp văn bản mới được tải lên vào một thùng s3. Trong hàm, tôi muốn lấy nội dung của tệp văn bản và xử lý nó bằng cách nào đó. Tôi đã tự hỏi nếu điều này là có thể ...?Cách lấy nội dung của tệp văn bản từ AWS s3 bằng hàm lambda?

Ví dụ: nếu tôi tải lên foo.txt, với nội dung foobarbaz, tôi muốn bằng cách nào đó có được foobarbaz trong hàm lambda của tôi để tôi có thể làm việc với nó. Tôi biết tôi có thể lấy siêu dữ liệu từ getObject hoặc một phương thức tương tự.

Cảm ơn!

Trả lời

20

Có, bạn có thể thực hiện việc này. Nếu bạn đọc số Lambda programming docs, bạn sẽ thấy khóa đối tượng S3 (và tên nhóm) được chuyển vào hàm Lambda của bạn thông qua tham số sự kiện. Sau đó bạn có thể lấy đối tượng từ S3, đọc nội dung của nó, và sau đó làm bất cứ điều gì bạn cần làm. BTW nội dung của đối tượng không phải là siêu dữ liệu; đó là dữ liệu.

gốc Ví dụ bây giờ đã có qua PDF tại wayback machine, nhưng mã cơ bản để lấy xô và đối tượng chủ chốt từ Lambda event là như sau:

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

Một khi bạn đã xô và quan trọng, bạn có thể gọi getObject để lấy đối tượng, và đây là một ví dụ hoàn chỉnh hơn cho thấy làm thế nào để làm điều này:

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

một số áp phích đã yêu cầu tương đương trong Java, vì vậy đây là một ví dụ:

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

Phải, nhưng trừ khi tôi nhầm, không phải là 'dữ liệu' trong 'console.log (' CONTENT TYPE: ', data.ContentType);' siêu dữ liệu thay vì nội dung của tệp? – jstnchng

+0

Nó cung cấp cho bạn dữ liệu sự kiện nhưng không phải là dữ liệu của chính tệp đó, iirc. – jstnchng

+0

@jstnchng Vâng, đó là siêu dữ liệu. Nhưng tôi nghĩ bạn đã yêu cầu 'foobarbaz' là nội dung của đối tượng S3 thực tế, vì vậy bạn phải gọi GetObject để lấy đối tượng. – jarmod

12

Bạn có thể sử dụng data.Body.toString('ascii') để lấy nội dung của tệp văn bản, giả định rằng tệp văn bản đã được mã hóa sử dụng định dạng ascii. Bạn cũng có thể chuyển các loại mã hóa khác cho hàm. Hãy xem Node-Buffer để biết thêm chi tiết.

+0

Làm việc như một sự quyến rũ, btw bạn có thể xem xét câu hỏi tương tự của tôi không? http://stackoverflow.com/questions/34056133/append-string-to-a-text-file-nodejs-in-aws-lambda – Casper

+0

đây phải là câu trả lời được chấp nhận imho –

Các vấn đề liên quan