Comment obtenir le contenu d'un fichier texte à partir de AWS s3 en utilisant une fonction lambda?
je me demandais si je pouvais mettre en place une fonction lambda pour AWS, déclenchée à chaque fois qu'un nouveau fichier texte est téléchargé dans un seau s3. Dans la fonction, je voudrais obtenir le contenu du fichier texte et de le transformer en quelque sorte. Je me demandais si cela était possible...?
Par exemple, si je télécharger foo.txt, avec contents fobarbaz, je voudrais d'une façon ou d'une autre obtenir fobarbaz dans ma fonction lambda afin que je puisse faire des choses avec elle. Je sais que je peux obtenir des métadonnées de getObject, ou un similaire méthode.
Merci!
3 réponses
la clé de l'objet S3 et le nom du seau sont passés dans votre fonction Lambda via le événement paramètre. Vous pouvez alors obtenir L'objet à partir de S3 et lire son contenu.
Base de code pour récupérer compartiment et de l'objet clé de la Lambda event
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 seau 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, donc 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";
}
}
}
Vous pouvez utiliser data.Body.toString('ascii')
pour obtenir le contenu du fichier texte, en supposant que le fichier texte a été encodé au format ascii. Vous pouvez également passer d'autres types d'encodage à la fonction. Découvrez Node-Tampon pour plus de détails.
j'utilise la fonction lambda avec un environnement Python 3.6. Le code ci-dessous Lira le contenu d'un fichier principal.txt à l'intérieur du seau my_s3_bucket. Assurez-vous de remplacer le nom du seau et le nom du fichier selon vos 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)