强制CloudFront分发/文件更新

我正在使用Amazon的CloudFront来为我的networking应用程序提供静态文件。

有没有办法告诉一个云端分布,它需要刷新它的文件或指出一个单一的文件,应该刷新?

亚马逊build议你像logo_1.gif,logo_2.gif等版本的文件作为解决这个问题的解决方法,但这似乎是一个非常愚蠢的解决scheme。 有没有其他的方法?

好消息。 亚马逊最终添加了失效function。 请参阅API参考 。

这是来自API Reference的示例请求:

POST /2010-08-01/distribution/[distribution ID]/invalidation HTTP/1.0 Host: cloudfront.amazonaws.com Authorization: [AWS authentication string] Content-Type: text/xml <InvalidationBatch> <Path>/image1.jpg</Path> <Path>/image2.jpg</Path> <Path>/videos/movie.flv</Path> <CallerReference>my-batch</CallerReference> </InvalidationBatch> 

截至3月19日,亚马逊现在允许Cloudfront的cachingTTL为0秒,因此您(理论上)不应该看到过时的对象。 所以如果你的资产是S3,你可以直接进入AWS Web Panel => S3 => Edit Properties => Metadata,然后将你的“Cache-Control”值设置为“max-age = 0”。

这是从API文档直接 :

要控制CloudFront是否caching对象以及多长时间,build议您使用带有max-age =指令的Cache-Control标头。 CloudFront将对象caching指定的秒数。 (最小值是0秒。)

通过Invalidation API,它会在几分钟内得到更新。
检查PHP Invalidator 。

斗资源pipe理器有一个用户界面,现在这很容易。 就是这样:

右键点击你的桶。 select“pipe理分配”。
右键单击您的分配。 select“获取Cloudfront失效列表”,然后select“创build”创build一个新的失效列表。 select要失效的文件,然后单击“失效”。 等待5-15分钟。

在5分钟内自动更新设置

好了朋友们。 现在执行自动CloudFront更新(失效)的最佳方式是创buildLambda函数,每次将任何file upload到S3存储桶(新存储或重写)时都会触发该函数。

即使您之前从未使用过lambda函数,也非常简单 – 只需按照我的分步说明操作即可,仅需5分钟:

步骤1

转到https://console.aws.amazon.com/lambda/home并单击;创build一个lambda函数

第2步

点击空白function(自定义)

第3步

点击空(描边)框,并从组合中selectS3

步骤4

select您的Bucket (与CloudFront分发相同)

第5步

事件types设置为“创build对象(全部)”

第6步

设置前缀和后缀 ,如果你不知道它是什么,就把它留空。

第七步

选中启用触发器checkbox,然后单击下一步

第8步

命名你的函数(如: YourBucketNameS3ToCloudFrontOnCreateAll

第9步

selectPython 2.7 (或更高版本)作为运行时

第10步

粘贴下面的代码,而不是默认的Python代码:

 from __future__ import print_function import boto3 import time def lambda_handler(event, context): for items in event["Records"]: path = "/" + items["s3"]["object"]["key"] print(path) client = boto3.client('cloudfront') invalidation = client.create_invalidation(DistributionId='_YOUR_DISTRIBUTION_ID_', InvalidationBatch={ 'Paths': { 'Quantity': 1, 'Items': [path] }, 'CallerReference': str(time.time()) }) 

步骤11

在新的浏览器选项卡中打开https://console.aws.amazon.com/cloudfront/home并复制您的CloudFront分配标识以供下一步使用。;

第12步

返回到lambda选项卡并在Python代码中粘贴您的分发标识而不是_YOUR_DISTRIBUTION_ID_。 保持周围的报价。

第13步

设置处理程序 :lambda_function.lambda_handler

第14步

点击angular色combobox,然后select创build一个自定义angular色 。 浏览器中的新标签将被打开。

第15步

单击查看策略文档 ,单击编辑 ,单击确定,并使用以下内容replaceangular色定义(按原样):

 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "cloudfront:CreateInvalidation" ], "Resource": [ "*" ] } ] } 

第16步

点击允许 。 这将返回到一个lambda。 仔细检查您刚刚创build的angular色名称是在现有angular色combobox中select的。

步骤17

内存(MB)设置为128, 超时设置为5秒。

第18步

点击下一步 ,然后点击创buildfunction

第19步

你已准备好出发! 现在,每次上传/重新上传任何文件到S3,都将在所有CloudFront Edge位置进行评估。

PS – 在testing时,确保您的浏览器正在从CloudFront加载映像,而不是从本地caching加载。

PSS – 请注意,每月只有前1000个文件无效,每个失效超过限制成本$ 0.005美元。 Lambdafunction的额外费用也可能适用,但是非常便宜。

如果你安装了boto (这不仅仅是python,而且还会安装一些有用的命令行工具),它提供了一个叫做cfadmin或者'cloud front admin'的命令行util,它提供了以下function:

 Usage: cfadmin [command] cmd - Print help message, optionally about a specific function help - Print help message, optionally about a specific function invalidate - Create a cloudfront invalidation request ls - List all distributions and streaming distributions 

您通过运行来validation事物:

 $sam# cfadmin invalidate <distribution> <path> 

只要发布通知任何人访问此页面(第一个结果“Cloudfront文件刷新”),有一个易于使用的+访问在线失效者可在swook.net

这个新的失效者是:

  • 完全在线(无需安装)
  • 全天候提供(由Google托pipe),不需要任何成员资格。
  • 有历史的支持,path检查,让你轻松使你的文件无效。 (通常在第一次失效后只需点击几下!)
  • 这也是非常安全的,你会发现在阅读其发布post 。

充分披露:我做了这个。 玩的开心!

一个非常简单的方法就是FOLDER版本控制。

所以,如果你的静态文件是数百个,只需把它们全部放到一个由year + versioning调用的文件夹中即可。

例如我使用一个名为2014_v1的文件夹里面我有我所有的静态文件…

所以在我的HTML中,我总是把引用的文件夹。 (当然,我有一个PHP包括我已经设置文件夹的名称)所以通过更改1文件它实际上改变了我所有的PHP文件..

如果我想要一个完整的刷新,我只需将该文件夹重命名为2014_v2到我的源代码中,然后将php包含到2014_v2

所有的HTML自动更改并询问新的path,cloudfront MISScaching并请求它到源。

例如:SOURCE.mydomain.com是我的源码,cloudfront.mydomain.com是CNAME到cloudfront的发行版。

所以PHP调用这个文件cloudfront.mydomain.com/2014_v1/javascript.js,当我想要一个完整的刷新,只是我重命名文件夹到源“2014_v2”,我更改PHP包括通过将文件夹设置为“2014_v2” 。

像这样,没有任何延误无效和没有成本!

这是我在stackoverflow的第一篇文章,希望我做得很好!

在ruby,使用雾gem

 AWS_ACCESS_KEY = ENV['AWS_ACCESS_KEY_ID'] AWS_SECRET_KEY = ENV['AWS_SECRET_ACCESS_KEY'] AWS_DISTRIBUTION_ID = ENV['AWS_DISTRIBUTION_ID'] conn = Fog::CDN.new( :provider => 'AWS', :aws_access_key_id => AWS_ACCESS_KEY, :aws_secret_access_key => AWS_SECRET_KEY ) images = ['/path/to/image1.jpg', '/path/to/another/image2.jpg'] conn.post_invalidation AWS_DISTRIBUTION_ID, images 

即使在无效的情况下,无效还需要5-10分钟才能在所有亚马逊边缘服务器上进行处理和刷新

如果您正在使用AWS,您可能也会使用其官方CLI工具(迟早)。 AWS CLI版本1.9.12或更高版本支持使文件名列表无效。

充分披露:我做了这个。 玩的开心!

当前AWS CLI支持在预览模式下失效。 在控制台中运行一次:

 aws configure set preview.cloudfront true 

我使用npm部署我的web项目。 我在我的package.json有以下脚本:

 { "build.prod": "ng build --prod --aot", "aws.deploy": "aws s3 sync dist/ s3://www.mywebsite.com --delete --region us-east-1", "aws.invalidate": "aws cloudfront create-invalidation --distribution-id [MY_DISTRIBUTION_ID] --paths /", "deploy": "npm run build.prod && npm run aws.deploy && npm run aws.invalidate" } 

有了上面的脚本,您可以通过以下方式部署您的站点:

 npm run deploy 
Interesting Posts