AWS Lambda函数和S3 - 仅在对象更改时才更改S3中对象的元数据

时间:2016-03-02 13:56:33

标签: javascript amazon-s3 lambda

我在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中更改时,我才需要更改该函数才能正常工作?

先谢谢!

1 个答案:

答案 0 :(得分:4)

您为自己创建了一个无限循环错误!更改对象时会触发Lambda函数,通过更改元数据并使用copyObject更改对象,从而再次加载Lambda函数。你立即点击100个并发请求Lambda限制,这是为了确保你现在不必支付一百万欧元,因为你写了一个无限循环。

为了避免这种情况,您需要重新考虑您的架构。有多种选择,但最简单的是我认为:

在您的Lambda代码中,首先执行s3.getObject并检查您要更改的标头是否已存在。如果是这样,请关闭Lambda函数。这样,每次编辑只执行两次Lambda函数。不是100%理想,但足以用于实际目的imo。