“aws s3 同步”CLI 更新 s3 存储桶内容后 Amazon CloudFront 缓存失效

Sha*_*nak 3 amazon-s3 amazon-web-services ruby-on-rails-3 amazon-cloudfront aws-cli

我有一个 rails 应用程序,它使用 aws cli 将一堆内容和配置与我的 s3 存储桶同步,如下所示:

aws s3 sync --acl 'public-read' #{some_path} s3://#{bucket_path}

现在,我正在寻找一些简单的方法来将刚刚同步更新的所有内容标记为 CloudFront 的无效或过期。

我想知道是否有某种方法可以使用aws cli提供的-cache-control标志来实现这一点。这样就不会使CouldFont 失效,而只需将文件标记为已过期,这样CloudFront 将被迫从存储桶中获取新数据。

我知道CloudFront POST API可以将文件标记为失效,但这意味着我将检测到上次同步中的更改,然后进行 API 调用。我可能有 1000 到 1 个文件同步的任何地方。不是一个令人愉快的前景。但是,如果我必须走这条路,我将如何在不解析 s3 同步的控制台输出的情况下检测更改——当然。

还是有其他想法?

谢谢!

adm*_*nva 5

使用全新的AWS Lambda怎么样?基本上,只要 AWS 中触发事件(在您的情况下,文件在 S3 中同步),它就会执行自定义代码。

每当您同步文件时,您都会收到类似以下内容的事件:

{
    "Records": [
        {
            "eventVersion": "2.0",
            // ...
            "s3": 
            {
                "s3SchemaVersion": "1.0",
                // ...
                "object": 
                {
                    "key": "hello.txt",
                    "size": 4,
                    "eTag": "1234"
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以检查已更改的文件名称并在 CloudFront 中使其失效。对于每个已更改的文件,您都会收到一个事件。

我创建了一个脚本,每当 S3 中发生更新时,该脚本都会使 CloudFront 中的路径失效,如果您决定使用此方法,这可能是一个很好的起点。它是用 JavaScript (Node.js) 编写的,因为它是 Lambda 使用的语言。

var aws = require('aws-sdk'),
    s3 = new aws.S3({apiVersion: '2006-03-01'}),
    cloudfront = new aws.CloudFront();

exports.handler = function(event, context) {
    var filePath = '/' + event.Records[0].s3.object.key,
        invalidateParams = {
            DistributionId: '1234',
            InvalidationBatch: {
                CallerReference: '1',
                Paths: {
                    Quantity: 1,
                    Items: [filePath]
                }
            }
        };

    console.log('Invalidating file ' + filePath);

    cloudfront.createInvalidation(invalidateParams, function(err, data) {
        if (err) {
            console.log(err, err.stack);  // an error occurred
        } else {
            console.log(data);  // successful response
        }
    });

    context.done(null,'');
};
Run Code Online (Sandbox Code Playgroud)

有关更多信息,您可以查看LambdaCloudFront 的 API文档。

但请注意,该服务仍处于预览阶段,可能会发生变化。


Kei*_*haw 5

您不能使用--cache-controlaws cli 提供的选项使 CloudFront 中的文件无效。该--cache-control选项直接映射到Cache-Control 标头,并且 CloudFront 将标头与文件一起缓存,因此如果您更改标头,您还必须无效以告诉 CloudFront 拉入更改后的标头。

如果要使用 aws cli,则必须解析同步命令的输出,然后使用 aws cloudfront cli。

或者,您可以s3cmd从 s3tools.org使用。该程序提供了--cf-invalidate使 CloudFront 中上传的文件无效的选项,以及一个同步命令将目录树同步到 S3。

s3cmd sync --cf-invalidate <local path> s3://<bucket name>

阅读s3cmd 使用页面以了解更多详细信息。