强制 CloudFront 分发/文件更新
-
13-09-2019 - |
题
我正在使用 Amazon 的 CloudFront 来提供 Web 应用程序的静态文件。
是否没有办法告诉云前端发行版它需要刷新其文件或指出应该刷新的单个文件?
亚马逊建议您对 logo_1.gif、logo_2.gif 等文件进行版本控制,作为解决此问题的方法,但这似乎是一个非常愚蠢的解决方案。难道就没有别的办法了吗?
解决方案
好消息。亚马逊终于加入无效特征。 参见API参考。
这是从API参考的示例请求:
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的缓存TTL为0秒,所以你(理论上)应该不会看到过时对象。所以,如果你有你的资产在S3中,你可以简单地去AWS的Web面板=> S3 =>编辑属性=>元数据,然后设置“缓存控制”的值改为“最大年龄= 0”。
这是直接从 API文档:
要控制CloudFront的缓存是否一个对象,并能持续多久,我们建议您使用Cache-Control头与最大年龄=指令。 CloudFront的缓存为指定的秒数的对象。 (最小值为0秒。)
使用失效API,它得到几分钟的更新。结果 检查出 PHP无效器。
在5分钟的自动更新设置强>
行,各位。现在来执行自动更新CloudFront的(无效)的最佳可能的方式是创建将每次触发时的任何文件被上传到S3桶(改写一个新的或)lambda函数。
即使你从未使用过lambda函数,它是很容易 - 只需跟着我一步一步的指示,它会带仅需5分钟:
<强>步骤1 强>
转到 https://console.aws.amazon.com/lambda/home一>并点击创建lambda函数强>
<强>第2步强>
点击上的空白函数(自定义)强>
<强>第3步强>
点击上空(抚摸)框和选择 S3 强>从组合
<强>步骤4 强>
选择您的铲斗(适用相同CloudFront的分布)
<强>步骤5 强>
设置一个的事件类型以 “对象创建(全部)”
<强>步骤6 强>
将前缀和后缀或保留空白,如果你不知道它是什么。
<强>步骤7 强>
检查启用触发复选框并点击下一步
<强>步骤8 强>
命名你的函数(是这样的: YourBucketNameS3ToCloudFrontOnCreateAll )
<强>步骤9 强>
选择的Python 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的分配的ID为在下一步骤中使用。
<强>步骤12 强>
返回拉姆达标签和粘贴在Python代码分发ID而非_YOUR_DISTRIBUTION_ID_。保持周围引号。
<强>步骤13 强>
设置的处理程序强>:lambda_function.lambda_handler
<强>步骤14 强>
点击上的角色组合框,然后选择创建自定义角色即可。在浏览器的新选项卡将被打开。
<强>步骤15 强>
点击查看政策文件下,点击修改,点击确定,并用以下替换角色定义(这是):
{
"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 强>
点击允许即可。这将返回到拉姆达。仔细检查您刚刚创建在现有角色组合框中选择该角色的名字。
<强>步骤17 强>
将存储器(MB)以128和超时以5秒。
<强>步骤18 强>
点击下一步,然后点击创建功能强>
<强>步骤19 强>
您是好去!现在,每次都会上传/重新上传任意文件到S3的时候,它会在所有CloudFront的边缘位置进行评估。
PS - 当您在测试时,请确保您的浏览器加载图片来自CloudFront的,而不是从本地缓存
。PSS - 请注意,每月只有前1000个文件失效是免费的,每个无效超限花费$ 0.005美元。也为lambda函数额外费用可能适用,但它是非常便宜。
斗浏览器具有UI,使这个现在很容易。方法如下:
右键点击你的水桶。选择“管理分布。”结果 右键点击你的分发。选择“获取的Cloudfront无效化名单” 然后选择“创建”创建一个新的无效化名单。 选择文件无效,并点击“无效”。等待5-15分钟。
如果您有博托安装(这不只是为Python,但还安装一堆有用的命令行实用程序)的,它提供了一个命令行UTIL具体称为cfadmin
或“云前管理员”,其提供下列功能性:
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
您运行invaliate事情:
$sam# cfadmin invalidate <distribution> <path>
只是发帖通知任何访问此页面的人(第一个结果在“Cloudfront 文件刷新”上) 有一个易于使用+访问 swook.net 提供在线失效器
这个新的无效器是:
- 完全在线(无需安装)
- 每周 7 天、每天 24 小时(由 Google 托管),不需要任何会员资格。
- 历史记录支持和路径检查可让您轻松使文件失效。(通常在第一次失效后只需点击几下即可!)
- 它也非常安全,您在阅读其内容时就会发现 发布帖子.
全面披露:我做的。玩得开心!
一个非常简单的方法来做到这一点是FOLDER版本。
所以,如果您的静态文件有几百例如,简单地把所有的人都为逐年+版本文件夹,名为
例如我用了一个名为2014_v1其中里面我有我的所有静态文件的文件夹...
所以我的HTML里面我始终把参考的文件夹。 (当然,我有一个PHP包括在那里我有设置文件夹的名称。)因此,通过在一个文件中,它实际上在我所有的PHP文件改变而改变..
如果我想要一个完整的刷新,我只需将文件夹重命名2014_v2到我的源和PHP内改变包括对2014_v2
所有HTML自动改变,并询问新的路径,CloudFront的MISS缓存和它请求的源。
实施例: SOURCE.mydomain.com是我的源, cloudfront.mydomain.com是CNAME到CloudFront的分布。
所以,所谓的PHP文件 cloudfront.mydomain.com/2014_v1/javascript.js 当我想完全刷新,简单地重新命名的文件夹到源为“2014_v2”和我改变PHP包括通过设置文件夹“2014_v2”。
筛选存在用于无效和NO COST没有延迟!
这是我在计算器的第一篇文章,希望我做得很好!
在红宝石,使用雾宝石
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 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
如果您正在使用AWS,你可能也使用其官方CLI工具(早晚)。 AWS CLI版本1.9.12 或以上支持无效的文件名称的列表。
披露:我在此。玩得开心!