我正在使用亚马逊的CloudFront服务来提供我的Web应用程序的静态文件。
有没有办法告诉CloudFront分配需要刷新文件或指出应该刷新的单个文件?
亚马逊建议您为文件命名版本,例如logo_1.gif,logo_2.gif等,作为解决此问题的变通方法,但这似乎是一个相当愚蠢的解决方案。难道绝对没有其他方法吗?
我正在使用亚马逊的CloudFront服务来提供我的Web应用程序的静态文件。
有没有办法告诉CloudFront分配需要刷新文件或指出应该刷新的单个文件?
亚马逊建议您为文件命名版本,例如logo_1.gif,logo_2.gif等,作为解决此问题的变通方法,但这似乎是一个相当愚蠢的解决方案。难道绝对没有其他方法吗?
好消息。Amazon终于添加了失效功能。详见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>
createInvalidation
请求后,我仍然看到更新需要5-10分钟左右才能失效。注意,我是在您评论4年之后写下这条评论的。 - tim peterson/*
- 所有文件 - 您只需支付一次失效费用,无论文件/ URL 的数量如何。此外,AWS每月提供1000个路径的免费失效请求。请参见文档中的失效请求部分。 - Wesley Gonçalves为了控制CloudFront是否缓存对象以及缓存时间,我们建议使用Cache-Control头并使用max-age指令。 CloudFront会将对象缓存指定的秒数。(最小值为0秒。)
Bucket Explorer 现在有一个用户界面,使这个过程相当容易。以下是操作步骤:
右键单击您的bucket。选择"管理分发"。
右键单击您的分发。选择"获取Cloudfront使无效列表"
然后选择"创建"来创建新的使无效列表。
选择要使无效的文件,然后点击"使无效"。等待5-15分钟。
使用无效 API,它会在几分钟内更新。
查看PHP Invalidator。
5分钟自动更新设置
大家好。目前执行CloudFront自动更新(失效)最好的方式是创建Lambda函数,每次上传文件到S3存储桶时触发(新文件或覆盖文件均可)。
即使您以前从未使用过lambda函数,也很容易 - 只需按照我的一步一步说明操作,只需花费5分钟:
第1步
转到https://console.aws.amazon.com/lambda/home,然后单击创建Lambda函数
第2步
单击空白函数(自定义)
第3步
单击空白(虚线)方框,并从组合中选择S3
第4步
选择您的 Bucket (与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
返回 lambda 选项卡,在 Python 代码中将您的分发 ID 粘贴到 _YOUR_DISTRIBUTION_ID_ 的位置。保留引号。
步骤 13
设置 handler:lambda_function.lambda_handler
步骤 14
点击 role 下拉框,选择 Create a custom role。浏览器会打开一个新标签页。
步骤 15
点击 view policy document,点击 edit,点击 OK 并用以下内容替换角色定义(不要更改标签):
{
"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。请仔细检查你刚刚创建的角色名是否在现有角色组合框中被选中。
步骤17
将内存(MB)设置为128,超时设置为5秒。
步骤18
点击下一步,然后点击创建函数。
步骤19
你已经准备好了!从现在开始,每次你上传/重新上传任何文件到S3时,它都将在所有CloudFront边缘位置进行评估。
附注 - 在测试时,请确保你的浏览器从CloudFront加载图像,而不是从本地缓存中加载。
附注2 - 请注意,每月仅有前1000个文件无效化是免费的,超过限制的每个无效化费用为0.005美元。此外,对于Lambda函数可能会有额外的收费,但价格非常便宜。
path = "/" + event["Records"][0]["s3"]["object"]["key"]
(严格来说,您将取最后一个项目,而不是第一个,但对于长度为1的数组,目前(但不必)情况下,这相当于同一件事情。另外,我从未提到或建议AWS删除任何通知。 - Philcfadmin
或“云前端管理”的命令行工具,提供以下功能: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
运行以下代码可以使事物无效:
$sam# cfadmin invalidate <distribution> <path>
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
当前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