强制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