javascript - AWS Lambda 函数和 S3 - 仅当对象发生更改时才更改 S3 中对象的元数据

标签 javascript amazon-s3 lambda

我在 Lambda 中有一个函数,仅当对象发生更改时,该函数才应将元数据 header 添加到 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 中的对象发生更改时才起作用?

提前致谢!

最佳答案

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

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

在您的 Lambda 代码中,首先执行 s3.getObject 并检查您要更改的 header 是否已存在。如果是这样,请关闭 Lambda 函数。这样,每次编辑只需执行 Lambda 函数两次。不是 100% 理想,但在我看来已经足够实用了。

关于javascript - AWS Lambda 函数和 S3 - 仅当对象发生更改时才更改 S3 中对象的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35749226/

相关文章:

javascript - 在angularjs中使用单个文本框加减

javascript - 如何在 View 中渲染 View 而不影响样式

amazon-s3 - 通过异步跨域请求在 S3 上托管动态站点

c# - 提取列表的 k 个最大元素

javascript - 改变浏览器位置的 AJAX 导航

javascript - TinyMCE 4 插入链接表单字段已禁用

amazon-web-services - AWS S3 使用什么端口?

django - 带有 Django 的简单缩略图引发访问被拒绝错误

linq - 如何在 lambda 表达式中输入 "let"?

c++ - omp 缩减和 lambda 函数