Как получить содержимое текстового файла из AWS s3 с помощью лямбда-функции?

Мне было интересно, могу ли я настроить функцию лямбда для AWS, запускаемую всякий раз, когда новый текстовый файл загружается в ведро s3. В функции я хотел бы получить содержимое текстового файла и обработать его каким-то образом. Мне было интересно, возможно ли это...?

Например, если я загружаю файл foo.txt с содержимым foobarbaz, я хотел бы как-то получить foobarbaz в своей лямбда-функции, чтобы я мог делать с ним что-то. Я знаю, что могу получить метаданные из getObject или аналогичный метод.

Спасибо!

Ответы

Ответ 1

Да, вы можете это сделать. Если вы читаете Lambda docs, вы увидите, что ключ объекта S3 (и имя ведра) передаются в вашу функцию Lambda через параметр события. Затем вы можете получить объект из S3, прочитать его содержимое и затем делать все, что вам нужно. Кстати, содержимое объекта не является метаданных; это данные.

Оригинальный пример теперь доступен через PDF в машине обратного пути, но базовый код для извлечения ведра и ключа объекта из Lambda 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";
        }
    }
}

Ответ 2

Вы можете использовать data.Body.toString('ascii') для получения содержимого текстового файла, считая, что текстовый файл был закодирован, используя формат ascii. Вы также можете передать другим типам кодирования функции. Подробнее см. Node -Buffer.