20

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

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

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

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

+0

Вы не можете изменять объекты в S3. Не могли бы вы добавить новый файл журнала? Это будет лучшей моделью и будет поддерживать несколько одновременных клиентов. – jarmod

+0

@jarmod Да, я подумал об этом, но проблема в том, что если злоумышленнику удастся получить доступ к моему серверу, у него будет возможность удалить локальный файл, хранящийся на нем, прежде чем он будет отправлен в ведро S3 (что позволяет говорят, происходит в конце дня). – Theodore

+0

Вы также можете посмотреть журналы CloudWatch. Позвольте ему управлять сложностью сбора и хранения ваших журналов, предоставлять средства поиска, политики хранения и позволять создавать предупреждения на основе показателей, которые вы можете настроить для своих журналов. – jarmod

ответ

37

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

S3 doesn't have an "append" operation.* После того, как объект был загружен, нет возможности изменить его на месте; ваш единственный вариант - загрузить новый объект для его замены, который не соответствует вашим требованиям.

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

+0

Я вижу .. Спасибо. – Theodore

+0

Могу ли я узнать, используя Multipart Upload, мы можем это достичь? – Anjali

+0

Multipart Upload позволит вам получить данные на S3 без загрузки исходного объекта, но это не позволит вам напрямую перезаписать исходный объект. См. https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html Затем вы можете удалить старый объект/переименовать новый. Это, однако, не то, что задает вопрос. – MikeGM

3

Лучшее решение, которое я знаю, это использовать AWS Kinesis шланговой:

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

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

enter image description here

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

+2

Обратите внимание, что при этом создается максимальное время (900 секунд с момента создания файла) или максимальный размер (размер файла 128 МБ), то есть Kishis firehose будет добавляться в тот же файл S3, пока не достигнет любого из этих пределов: https : //docs.aws.amazon.com/firehose/latest/dev/create-configure.html –

0

Я имел подобный вопрос, и это то, что я просил

how to Append data in file using AWS Lambda

Вот что я придумал, чтобы решить данную проблему:

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

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

Надеюсь, что эта помощь !!

+0

Функция 'writeToS3' перезапишет файл, а не добавит его. – duskwuff

Смежные вопросы