Подтвердить что ты не робот

Добавление данных к объекту S3

Скажем, что у меня есть машина, которую я хочу записать в определенный файл журнала, хранящийся в ведре S3.

Итак, машина должна обладать способностями записи к этому ведру, но я не хочу, чтобы у нее была возможность перезаписывать или удалять любые файлы в этом ковше (включая тот, который я хочу, чтобы он писал).

Итак, в основном, я хочу, чтобы моя машина могла только добавлять данные в этот файл журнала, не отменяя ее или не загружая.

Есть ли способ настроить мой S3 таким образом? Может быть, есть какая-то политика IAM, которую я могу приложить к ней, чтобы она работала, как я хочу?

4b9b3361

Ответ 1

К сожалению, вы не можете.

S3 не имеет операции добавления. * После того, как объект был загружен, есть нет возможности изменить его на месте; ваш единственный вариант - загрузить новый объект для его замены, который не соответствует вашим требованиям.

*: Да, я знаю, что этот пост - пару лет. Тем не менее он все еще точнее.

Ответ 2

Как говорится в принятом ответе, вы не можете. Лучшее из известных мне решений - это использовать:

AWS Kinesis Firehose

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

Их пример кода выглядит сложным, но ваш может быть очень простым. Вы продолжаете выполнять операции PUT (или BATCH PUT) над потоком доставки Kinesis Firehose в своем приложении (используя AWS SDK) и настраиваете поток доставки Kinesis Firehose для отправки потоковых данных в выбранную корзину AWS S3 (в Консоль AWS Kinesis Firehose).

enter image description here

Это все еще не так удобно, как >> из командной строки Linux, потому что после того, как вы создали файл на S3, вам снова придется иметь дело с загрузкой, добавлением и загрузкой нового файла, но вы должны делать это только один раз в пакете линий, а не для каждой строки данных, поэтому вам не нужно беспокоиться об огромных расходах из-за объема операций добавления. Может быть, это можно сделать, но я не вижу, как это сделать с консоли.

Ответ 3

Объекты на S3 не могут быть добавлены. В этом случае у вас есть 2 решения:

  1. скопировать все данные S3 в новый объект, добавить новый контент и записать обратно в 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. Второй вариант - использовать Kinesis Firehose. Это довольно просто. Вам нужно создать свой поток доставки пожарных рукавов и связать пункт назначения с корзиной S3. Вот оно!
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
    }); 
}

Ответ 4

Как уже отмечалось ранее, объекты S3 недоступны для добавления.
Однако другим решением было бы записать в журналы CloudWatch и затем экспортировать нужные журналы на S3. Это также предотвратит удаление злоумышленниками, обращающимися к вашему серверу, из вашей корзины S3, поскольку Lambda не потребует каких-либо разрешений S3.

Ответ 5

У меня была аналогичная проблема, и это то, о чем я просил

Как добавить данные в файл с помощью AWS Lambda

Вот что я придумал для решения вышеуказанной проблемы:

Использовать getObject для извлечения из существующего файла

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

Запись функции для добавления в файл

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

Надеюсь на эту помощь!