web-dev-qa-db-fra.com

Comment obtenir le contenu d'un fichier texte depuis AWS s3 à l'aide d'une fonction lambda?

Je me demandais si je pouvais configurer une fonction lambda pour AWS, déclenchée chaque fois qu'un nouveau fichier texte est téléchargé dans un compartiment s3. Dans la fonction, je voudrais obtenir le contenu du fichier texte et le traiter en quelque sorte. Je me demandais si c'était possible ...?

Par exemple, si je télécharge foo.txt, avec le contenu foobarbaz, je voudrais d’une manière ou d’une autre obtenir foobarbaz dans ma fonction lambda afin que je puisse faire des choses avec. Je sais que je peux obtenir des métadonnées à partir de getObject, ou d'une méthode similaire.

Merci!

46
jstnchng

La clé d'objet S3 et le nom de compartiment sont transmis à votre fonction Lambda via le paramètre event. Vous pouvez alors obtenir l'objet de S3 et lire son contenu.

Le code de base pour récupérer le seau et la clé d’objet de Lambda event se présente comme suit:

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

Une fois que vous avez le compartiment et la clé, vous pouvez appeler getObject pour récupérer l'objet:

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

Un certain nombre d’affiches ont demandé l’équivalent en Java. Voici un exemple:

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";
        }
    }
}
50
jarmod

Vous pouvez utiliser data.Body.toString('ascii') pour obtenir le contenu du fichier texte, en supposant que le fichier texte a été codé au format ascii. Vous pouvez également transmettre d'autres types d'encodage à la fonction. Départ Node-Buffer pour plus de détails.

14
jaywalker

J'utilise la fonction lambda avec un environnement python 3.6. Le code ci-dessous lira le contenu d'un fichier main.txt dans le seau my_s3_bucket. Assurez-vous de remplacer le nom du seau et le nom du fichier en fonction de votre Besoins.

def lambda_handler(event, context):
    # TODO implement
    import boto3

    s3 = boto3.client('s3')
    data = s3.get_object(Bucket='my_s3_bucket', Key='main.txt')
    contents = data['Body'].read()
    print(contents)
6
Shubham Bansal