Добавление данных к объекту S3
Скажем, что у меня есть машина, которую я хочу записать в определенный файл журнала, хранящийся в ведре S3.
Итак, машина должна обладать способностями записи к этому ведру, но я не хочу, чтобы у нее была возможность перезаписывать или удалять любые файлы в этом ковше (включая тот, который я хочу, чтобы он писал).
Итак, в основном, я хочу, чтобы моя машина могла только добавлять данные в этот файл журнала, не отменяя ее или не загружая.
Есть ли способ настроить мой S3 таким образом? Может быть, есть какая-то политика IAM, которую я могу приложить к ней, чтобы она работала, как я хочу?
Ответы
Ответ 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 решения:
- скопировать все данные 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
}
});
}
});
}
- Второй вариант - использовать 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');
});
}
Надеюсь на эту помощь!