我在Lambda中有一个函数,只有在对象发生变化时才应该将元数据头添加到s3上的对象。
ContentType: 'application/javascript'
CacheControl: 'max-age=600'

但事实证明,Lambda在一秒内检查了大约100次,不仅是对象发生了变化,而且成本也很高。
访问S3上的日志:
b6234e2652b93344f7 aa [02/Mar/2016:11:00:55 +0000] 54.0.0.209 arn:aws:sts::718436:assumed-role/lambda_s3_exec_role/awslambda_642_201609 805 REST.COPY.OBJECT /local.js "PUT /local.js HTTP/1.1" 200 - 234 4404 50 24 "-" "aws-sdk-nodejs/2.2.32 linux/v0.10.36" -
b6234ee5f9cf0344f7 aa [02/Mar/2016:11:00:55 +0000] 54.0.0.209 arn:aws:sts::71836:assumed-role/lambda_s3_exec_role/awslambda_642_209 890005 REST.COPY.OBJECT_GET local.js - 200 - - 4404 - - - - -

功能:
console.log('Loading function');
var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
exports.handler = function(event, context) {
//console.log('Received event:', JSON.stringify(event, null, 2));
// Get the object from the event and show its content type
var bucket = event.Records[0].s3.bucket.name;
var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
var params = {
Bucket: bucket,
Key: key,
CopySource: encodeURIComponent(bucket+"/"+key),
ContentType: 'application/javascript',
CacheControl: 'max-age=600',
"Metadata":{
},
MetadataDirective: 'REPLACE'
};
//s3.getObject(params, function(err, data) {
s3.copyObject(params, function(err, data) {
if (err) {
console.log(err);
var message = "Error getting object " + key + " from bucket " + bucket +
". Make sure they exist and your bucket is in the same region as this function.";
console.log(message);
context.fail(message);
} else {
console.log('CONTENT TYPE:', data.ContentType);
context.succeed(data.ContentType);
}
});
};

只有当对象在s3中更改时,我才需要更改该函数才能正常工作?
先谢谢!
答案 0 :(得分:4)
您为自己创建了一个无限循环错误!更改对象时会触发Lambda函数,通过更改元数据并使用copyObject更改对象,从而再次加载Lambda函数。你立即点击100个并发请求Lambda限制,这是为了确保你现在不必支付一百万欧元,因为你写了一个无限循环。
为了避免这种情况,您需要重新考虑您的架构。有多种选择,但最简单的是我认为:
在您的Lambda代码中,首先执行s3.getObject
并检查您要更改的标头是否已存在。如果是这样,请关闭Lambda函数。这样,每次编辑只执行两次Lambda函数。不是100%理想,但足以用于实际目的imo。