javascript - tutorial - porque usar lambda aws
¿Cómo obtener los contenidos de un archivo de texto de AWS s3 usando una función lambda? (3)
Me preguntaba si podría configurar una función lambda para AWS, que se activa cada vez que se carga un nuevo archivo de texto en un depósito de s3. En la función, me gustaría obtener el contenido del archivo de texto y procesarlo de alguna manera. Me preguntaba si esto era posible ...
Por ejemplo, si cargo foo.txt, con el contenido foobarbaz, me gustaría obtener de alguna manera foobarbaz en mi función lambda para poder hacer cosas con él. Sé que puedo obtener metadatos de getObject o un método similar.
¡Gracias!
Estoy usando la función lambda con un entorno python 3.6. El siguiente código leerá el contenido de un archivo main.txt dentro del cubo my_s3_bucket. Asegúrese de reemplazar el nombre del cubo y el nombre de archivo según sus necesidades.
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)
La clave del objeto S3 y el nombre del cubo pasan a su función Lambda a través del parámetro de evento . A continuación, puede obtener el objeto de S3 y leer su contenido.
El código básico para recuperar el cubo y la clave de objeto del event
Lambda es el siguiente:
exports.handler = function(event, context, callback) {
var src_bkt = event.Records[0].s3.bucket.name;
var src_key = event.Records[0].s3.object.key;
};
Una vez que tenga el cubo y la clave, puede llamar a getObject para recuperar el objeto:
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);
}
});
};
Varios carteles han pedido el equivalente en Java, así que aquí hay un ejemplo:
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";
}
}
}
Puede usar data.Body.toString(''ascii'')
para obtener el contenido del archivo de texto, suponiendo que el archivo de texto se codificó como formato ascii. También puede pasar otros tipos de codificación a la función. Consulte Node-Buffer para más detalles.