如何在亚马逊的CDN(CloudFront)上更新文件?

16

有没有方法可以更新存储在Amazon CloudFront(亚马逊的CDN服务)上的文件?似乎它不会接受我们所做的任何文件更新(例如删除文件并将新文件存储为以前相同的文件名)。我是否必须显式地触发更新进程以从边缘服务器中删除文件,以便发布新文件内容?

谢谢您的帮助。


请尝试在 http://serverfault.com/ 上提问此问题。 - Alan Haggai Alavi
更新2021年(12年后)给@AlanHaggaiAlavi,下面有很好的答案。 :) - Aidin
10个回答

18

以下是我使用CloudFront控制面板的方法。

  1. 从服务列表中选择CloudFront。
  2. 确保从左上角选择了Distributions
  3. 接下来,从列表中选择关联的分发链接(在id下方)。

插入图片描述

  1. 选择Invalidations 选项卡。
  2. 点击Create Invalidation 按钮,并输入要使其失效(更新)的文件位置。

例如:

插入图片描述

  1. 然后点击Invalidate 按钮,您现在应该看到状态下方的InProgress

插入图片描述

通常需要10至15分钟完成您的失效请求,具体取决于请求的大小。

一旦它说已完成,您就可以开始使用它了。

提示: 一旦您创建了一些失效请求,如果您回来需要使同一文件失效,请使用选择框,然后复制 链接将变为可用,使其更快。


1
注意:在上传新文件之前,您必须使缓存文件失效。我在上传修订版后无法将更新的文件推出,然后使旧缓存失效时遇到了问题。 - Cody
2
我实际上发现相反,我确保上传新文件,然后运行失效。 - CoalaWeb

12

亚马逊增加了一个无效化功能。 这是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>

2

在哪里指定? - keeping_it_simple
您可以在CloudFront分发详细信息的“行为”选项卡下设置TTL。启用“对象缓存”=“自定义”,然后您应该能够设置分发的默认值。在积极开发时,短TTL是可以接受的,但如果没有太多更新,则持续时间应延长。 - Cody

1
在Ruby中,使用fog 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

即使是无效的,使失效处理并在所有Amazon边缘服务器上刷新仍需要5-10分钟。

1

1

1

我好像记得在serverfault上已经看到过这个问题的答案:

你说的"Amazon CDN"是指"CloudFront"吗?

它是有缓存的,所以如果你需要立即更新它(而不是等待24小时后新版本可见),你就必须选择一个新的名称。比如用"logo.png--0"代替"logo.png",然后使用"logo.png--1"来更新它,并修改你的HTML代码指向它。

没有办法"刷新"亚马逊云前端。

编辑:以前是不可能的,现在可以了。请参考对此回复的评论。


请参见https://dev59.com/LXM_5IYBdhLWcg3wslbs。 - RSG
这不是真的,您可以通过使缓存失效来更新内容。 - rsabir
@rsabir 请在评论前先阅读全文。你说的已经在6年前添加了。 - Thomas

1

0

0

我将总结可能的解决方案。

情况1:一次性更新:使用控制台UI。

您可以按照@CoalaWeb的答案手动浏览控制台的UI,并在CloudFront上启动“作废”,通常不到一分钟即可完成。这是一个单击操作。

此外,您还可以在UI中手动更新它指向的S3路径。

情况2:在S3中相同路径频繁更新:使用AWS CLI。

您可以使用AWS CLI通过命令行简单地运行上述操作。

命令如下:

    aws cloudfront create-invalidation --distribution-id E1234567890 --paths "/*"

将代码中的 E1234567890 替换为您在控制台中看到的 DistributionId。您还可以将其限制为某些文件,而不是对于所有文件均使用 /*

如何在 Node/JavaScript 项目中使用 package.json 作为目标的示例可在 this answer 中找到。(不同问题)

注:

  • 我相信当前每月前1000次无效化是免费的(截至2021年4月)。
  • 执行 AWS CLI 无效化的用户应该在 IAM 中拥有 CreateInvalidation 访问权限。(以下案例为例。)

第3种情况:经常更新,S3 上的路径每次都会更改:使用手动脚本。

如果您正在在 S3 中存储文件/工件的不同版本(即路径包含文件/工件的版本 ID),并且每次需要在 CloudFront 中更改它,则需要编写一个脚本来执行此操作。

很遗憾,AWS CLI for CloudFront 不允许您使用一个命令轻松更新路径。您需要有一个详细的脚本。我写了一个,其中包含详细信息,请参见this answer(不同的问题)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接