que putobject amazon-web-services amazon-s3 aws-sdk amazon-kinesis-firehose

amazon web services - putobject - Agregar datos a un objeto S3



que es un bucket (5)

Como dice la respuesta aceptada, no puedes. La mejor solución que conozco es usar:

AWS Kinesis Firehose

https://aws.amazon.com/kinesis/firehose/

Su ejemplo de código parece complicado, pero el tuyo puede ser realmente simple. Continúa realizando operaciones PUT (o BATCH PUT) en un flujo de entrega de Kinesis Firehose en su aplicación (usando el SDK de AWS), y configura el flujo de entrega de Kinesis Firehose para enviar sus datos transmitidos a un depósito de AWS S3 de su elección (en el Consola AWS Kinesis Firehose).

Todavía no es tan conveniente como >> desde la línea de comandos de Linux, porque una vez que ha creado un archivo en S3, nuevamente tiene que lidiar con la descarga, el agregado y la carga del nuevo archivo, pero solo tiene que hacerlo una vez por lote de líneas en lugar de para cada línea de datos, por lo que no necesita preocuparse por los grandes cargos debido al volumen de operaciones de adición. Tal vez se pueda hacer, pero no puedo ver cómo hacerlo desde la consola.

Digamos que tengo una máquina que quiero poder escribir en un determinado archivo de registro almacenado en un depósito S3.

Por lo tanto, la máquina necesita tener habilidades de escritura en ese depósito, pero no quiero que tenga la capacidad de sobrescribir o eliminar ningún archivo en ese depósito (incluido el que quiero que escriba).

Básicamente, quiero que mi máquina solo pueda agregar datos a ese archivo de registro, sin anularlo o descargarlo.

¿Hay alguna manera de configurar mi S3 para que funcione así? ¿Quizás haya alguna política de IAM que pueda adjuntar para que funcione como quiero?


Como otros han dicho anteriormente, los objetos S3 no son anexables.
Sin embargo, otra solución sería escribir en los registros de CloudWatch y luego exportar los registros que desea a S3 . Esto también evitaría que los atacantes que acceden a su servidor eliminen de su bucket S3, ya que Lambda no requeriría ningún permiso S3.


Lamentablemente, no puedes.

S3 no tiene una operación de "agregar". * Una vez que se ha cargado un objeto, no hay forma de modificarlo en su lugar; su única opción es cargar un nuevo objeto para reemplazarlo, lo que no cumple con sus requisitos.

*: Sí, sé que esta publicación tiene un par de años. Sin embargo, sigue siendo precisa.


Los objetos en S3 no son anexables. Tienes 2 soluciones en este caso:

  1. copie todos los datos de S3 a un nuevo objeto, agregue el nuevo contenido y vuelva a escribir en S3.

function writeToS3(input) { var content; var getParams = { Bucket: ''myBucket'', Key: "myKey" }; s3.getObject(getParams, function(err, data) { if (err) console.log(err, err.stack); else { content = new Buffer(data.Body).toString("utf8"); content = content + ''/n'' + new Date() + ''/t'' + input; var putParams = { Body: content, Bucket: ''myBucket'', Key: "myKey", ACL: "public-read" }; s3.putObject(putParams, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else { console.log(data); // successful response } }); } }); }

  1. La segunda opción es usar Kinesis Firehose. Esto es bastante sencillo. Debe crear su flujo de entrega de manguera de incendios y vincular el destino al depósito S3. ¡Eso es!

function writeToS3(input) { var content = "/n" + new Date() + "/t" + input; var params = { DeliveryStreamName: ''myDeliveryStream'', /* required */ Record: { /* required */ Data: new Buffer(content) || ''STRING_VALUE'' /* Strings will be Base-64 encoded on your behalf */ /* required */ } }; firehose.putRecord(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }); }


Tuve el problema similar y esto es lo que había pedido

Cómo agregar datos en un archivo con AWS Lambda

Esto es lo que se me ocurre para resolver el problema anterior:

Use getObject para recuperar del archivo existente

s3.getObject(getParams, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else{ console.log(data); // successful response var s3Projects = JSON.parse(data.Body); console.log(''s3 data==>'', s3Projects); if(s3Projects.length > 0) { projects = s3Projects; } } projects.push(event); writeToS3(); // Calling function to append the data });

Función de escritura para agregar en el archivo

function writeToS3() { var putParams = { Body: JSON.stringify(projects), Bucket: bucketPath, Key: "projects.json", ACL: "public-read" }; s3.putObject(putParams, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response callback(null, ''Hello from Lambda''); }); }

¡¡Espero que esto ayude!!