强制CloudFront分发/文件更新

Mar*_*tin 144 cloud cdn amazon-web-services amazon-cloudfront

我正在使用亚马逊的CloudFront来提供我的网络应用程序的静态文件.

有没有办法告诉云端分发它需要刷新它的文件还是指出应该刷新的单个文件?

亚马逊建议您将文件版本如logo_1.gif,logo_2.gif等作为此问题的解决方法,但这似乎是一个非常愚蠢的解决方案.绝对没有别的办法吗?

Jam*_*ruk 132

好消息.亚马逊最终添加了一个失效功能.请参阅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>
Run Code Online (Sandbox Code Playgroud)

  • 如果您不想自己提出API请求,您还可以登录到Amazon Console并在那里创建一个Invalidation请求:http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html (35认同)
  • 请记住,每月首次发出1,000次无效请求后,每个文件的费用为0.005美元https://aws.amazon.com/cloudfront/pricing/ (20认同)
  • 请注意,失效将需要一些时间(根据我读过的一些博客帖子显然需要5到30分钟). (9认同)
  • 截至 2020 年,每个路径的成本为 0.005 美元,不再归档。因此,如果您使像“/*”这样的路径 - *所有文件* - 您只需为一次失效付费,无论文件/URL 的数量有多少。此外,AWS 每月免费提供 1000 个失效路径。请参阅[文档](https://aws.amazon.com/cloudfront/pricing/) 中的**无效请求** (4认同)
  • Sweeeeeeeeeeeeeet! (3认同)

Joh*_*how 19

截至3月19日,亚马逊现在允许Cloudfront的缓存TTL为0秒,因此您(理论上)永远不应该看到过时的对象.因此,如果您在S3中拥有资产,则只需转到AWS Web Panel => S3 => Edit Properties => Metadata,然后将"Cache-Control"值设置为"max-age = 0".

这直接来自API文档:

要控制CloudFront是否缓存对象以及持续多长时间,我们建议您使用带有max-age =指令的Cache-Control标头.CloudFront将对象缓存指定的秒数.(最小值为0秒.)

  • 叫我疯了但是将TTL设置为0并且max-age设置为0实际上是在没有缓存的情况下使用CloudFront,是否会将所有请求转发到源不断检查更新?基本上使CDN无用吗? (31认同)
  • 如果您只是使用cloudfront作为一种机制来使静态启用SSL的S3站点具有自定义域,则缓存无关紧要.此外,我们正在讨论的这些问题是,在开发阶段,0次缓存是好的. (6认同)

anj*_*esh 10

使用Invalidation API,它会在几分钟内得到更新.
查看PHP Invalidator.


Kai*_*nax 10

5分钟内自动更新设置

好,朋友们.现在执行自动CloudFront更新(失效)的最佳方法是创建Lambda函数,每次将任何文件上载到S3存储桶(新存储或重写)时都会触发该函数.

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

步骤1

转到https://console.aws.amazon.com/lambda/home并单击" 创建lambda函数"

第2步

单击空白功能(自定义)

第3步

单击空(抚摸)框并从组合中选择S3

第4步

选择您的Bucket(与CloudFront分配相同)

第5步

事件类型设置为"对象创建(全部)"

第6步

如果您不知道它是什么,请设置前缀和后缀或将其留空.

第7步

选中Enable trigger复选框,然后单击Next

第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())
            })
Run Code Online (Sandbox Code Playgroud)

第11步

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

第12步

返回lambda选项卡并在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": [
          "*"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

第16步

单击允许.这会让你回到lambda.仔细检查在" 现有角色"组合框中选择刚刚创建的角色名称.

第17步

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

第18步

单击Next,然后单击Create function

第19步

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

PS - 在测试时,请确保您的浏览器正在从CloudFront加载图像,而不是从本地缓存加载图像.

PSS - 请注意,每月只有前1000个文件失效是免费的,每个失效超过限额的费用为0.005美元.Lambda功能的额外费用可能适用,但它非常便宜.


Leo*_*opd 9

Bucket Explorer有一个UI,现在可以很容易.这是如何做:

右键单击您的存储桶.选择"管理分配".
右键单击您的发行版.选择"获取Cloudfront无效列表"然后选择"创建"以创建新的无效列表.选择要使其无效的文件,然后单击"无效".等5-15分钟.


sam*_*sam 5

如果您安装了boto(这不仅适用于 python,还安装了一堆有用的命令行实用程序),它会提供一个专门称为cfadmin“cloud front admin”的命令行实用程序,它提供以下功能:

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
Run Code Online (Sandbox Code Playgroud)

您可以通过运行以下命令使事情无效:

$sam# cfadmin invalidate <distribution> <path>
Run Code Online (Sandbox Code Playgroud)