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