我想知道是否可以爲AWS設置一個lambda函數,只要將新文本文件上傳到s3存儲桶中就會觸發它。在函數中,我想獲取文本文件的內容並以某種方式處理它。我想知道這是否可能...?如何使用lambda函數從AWS s3獲取文本文件的內容?
例如,如果我上傳foo.txt,內容爲foobarbaz,我想以某種方式在我的lambda函數中獲得foobarbaz,所以我可以用它做東西。我知道我可以從getObject或類似的方法獲取元數據。
謝謝!
我想知道是否可以爲AWS設置一個lambda函數,只要將新文本文件上傳到s3存儲桶中就會觸發它。在函數中,我想獲取文本文件的內容並以某種方式處理它。我想知道這是否可能...?如何使用lambda函數從AWS s3獲取文本文件的內容?
例如,如果我上傳foo.txt,內容爲foobarbaz,我想以某種方式在我的lambda函數中獲得foobarbaz,所以我可以用它做東西。我知道我可以從getObject或類似的方法獲取元數據。
謝謝!
是的,你可以做到這一點。如果您閱讀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";
}
}
}
您可以使用data.Body.toString('ascii')
來獲取文本文件的內容,假定文本文件使用ascii格式編碼。您也可以將其他編碼類型傳遞給該函數。查看Node-Buffer瞭解更多詳情。
工程就像一個魅力,順便說一句,你可以看看我的類似問題? http://stackoverflow.com/questions/34056133/append-string-to-a-text-file-nodejs-in-aws-lambda – Casper
這應該是公認的答案imho –
對,但除非我錯了,不是'console.log('CONTENT TYPE:',data.ContentType);'元數據而不是文件的內容中的數據? – jstnchng
它給你的事件數據,但不是文件本身的數據,iirc。 – jstnchng
@jstnchng是的,這是元數據。但我認爲你要求的是'foobarbaz'這是實際的S3對象的內容,所以你必須調用GetObject來檢索對象。 – jarmod