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";
}
}
}
Dobrze, ale jeśli się nie mylę, to nie jest "data" w 'console.log (" CONTENT TYPE: ', data.ContentType); 'metadane zamiast zawartości pliku? – jstnchng
Daje dane zdarzeń, ale nie dane samego pliku, iirc. – jstnchng
@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