首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS函数和S3 -仅在对象更改时才更改S3中的对象的元数据

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

Stack Overflow用户
提问于 2016-03-02 13:56:33
回答 1查看 3.1K关注 0票数 1

我在Lambda中有一个函数,它只在对象更改时才会将元数据头添加到s3上的对象中。

代码语言:javascript
复制
ContentType: 'application/javascript'
CacheControl: 'max-age=600'

但是事实证明,Lambda在一秒钟内检查了水桶大约100次,而不仅仅是如果对象改变了,而且它的成本很高。

S3上的访问日志:

代码语言:javascript
复制
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 - - - - -

功能:

代码语言:javascript
复制
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中更改时,我需要更改的函数才能工作吗?

感谢先进的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-02 14:14:46

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

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

在Lambda代码中,首先执行s3.getObject,并检查要更改的标头是否已经存在。如果是,请关闭Lambda函数。这样,每次编辑只能执行Lambda函数两次。不是百分之百的理想,但足够实用的海事组织。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35749226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档