假设我有一台想要写入存储在S3存储桶中的特定日志文件的机器。
因此,机器需要对该存储桶具有写入功能,但是,我不希望它具有覆盖或删除该存储桶中任何文件(包括我要写入的文件)的能力。
因此,基本上,我希望我的机器只能将数据追加到该日志文件,而不会覆盖或下载该文件。
有没有一种方法可以配置S3使其正常工作?也许我可以附加一些IAM策略,以使其按我的意愿工作?
假设我有一台想要写入存储在S3存储桶中的特定日志文件的机器。
因此,机器需要对该存储桶具有写入功能,但是,我不希望它具有覆盖或删除该存储桶中任何文件(包括我要写入的文件)的能力。
因此,基本上,我希望我的机器只能将数据追加到该日志文件,而不会覆盖或下载该文件。
有没有一种方法可以配置S3使其正常工作?也许我可以附加一些IAM策略,以使其按我的意愿工作?
Answers:
如公认的答案所述,您不能这样做。我知道的最佳解决方案是使用:
https://aws.amazon.com/kinesis/firehose/
他们的代码示例看起来很复杂,但是您的示例可能非常简单。您继续对应用程序中的Kinesis Firehose交付流执行PUT(或BATCH PUT)操作(使用AWS开发工具包),并配置Kinesis Firehose交付流将流式数据发送到您选择的AWS S3存储桶(在AWS Kinesis Firehose控制台)。
它仍然不像>>
Linux命令行那样方便,因为一旦在S3上创建了文件,您就不得不再次处理新文件的下载,附加和上载,但是您只需要每行执行一次即可,而不是而不是每行数据,因此您不必担心由于追加操作的数量而产生的巨额费用。也许可以做到,但是我看不到如何从控制台上做到。
S3上的对象不可追加。在这种情况下,您有2个解决方案:
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 } }); } }); }
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 }); }
正如其他人之前所说,S3对象不可附加。
但是,另一个解决方案是写出CloudWatch日志,然后将您想要的日志导出到S3。这也可以防止任何访问您服务器的攻击者从S3存储桶中删除,因为Lambda不需要任何S3权限。
我有类似的问题,这就是我所问的
这是我想出的解决以上问题的方法:
使用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');
});
}
希望这个帮助!
writeToS3
函数将覆盖文件,而不是附加文件。