首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >亚马逊CloudFront缓存在'aws s3同步‘命令行界面更新s3存储桶内容后失效

亚马逊CloudFront缓存在'aws s3同步‘命令行界面更新s3存储桶内容后失效
EN

Stack Overflow用户
提问于 2015-04-07 05:18:06
回答 3查看 2.6K关注 0票数 3

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

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

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

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

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

还有其他的想法吗?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2015-04-15 03:34:09

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

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

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

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

有关更多详细信息,请阅读s3cmd usage page

票数 5
EN

Stack Overflow用户

发布于 2015-04-09 14:27:01

使用全新的AWS Lambda怎么样?基本上,每当在亚马逊网络服务中触发事件时,它都会执行自定义代码(在您的示例中,文件在S3中同步)。

无论何时同步文件,都会收到类似以下内容的事件:

代码语言:javascript
复制
{
    "Records": [
        {
            "eventVersion": "2.0",
            // ...
            "s3": 
            {
                "s3SchemaVersion": "1.0",
                // ...
                "object": 
                {
                    "key": "hello.txt",
                    "size": 4,
                    "eTag": "1234"
                }
            }
        }
    ]
}

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

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

代码语言:javascript
复制
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,'');
};

有关更多信息,请查看Lambda'sCloudFront's API文档。

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

票数 4
EN

Stack Overflow用户

发布于 2015-04-09 12:35:18

AWS CLI工具可以output JSON。收集JSON结果,然后根据您在帖子中包含的链接提交无效请求。为了简单起见,您可以使用像CloudFront Invalidator这样的gem,它将使用一个路径列表来使其无效。

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

https://stackoverflow.com/questions/29479861

复制
相关文章

相似问题

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