使用Paws进行AWS CloudFront缓存失效

使用Paws部署静态网站中,我开发了一个简单的脚本来将文件上传到AWS S3,使用Paws。在这篇文章中,我将描述一个用于使CloudFront缓存失效的脚本:这可以用来强制CloudFront重新缓存S3上已更改的文件。

AWS CloudFront

CloudFront是Amazon的内容分发网络服务。它用于缓存本地版本文件,以便更快地交付请求;例如,如果您使用S3在Amazon的美国东部地区托管您的网站,东海岸客户的网站文件可能比西海岸的加载速度更快。然而,使用像CloudFront这样的CDN,可以在全球范围内保存网站文件的副本,因此访客的浏览器可以从更近的地理位置获取网站文件,从而提高网站速度。

当S3上的缓存网站文件更新时,它们需要从CloudFront缓存中失效。这将迫使CloudFront获取失效文件的新副本。

代码

使用Paws与CloudFront相当简单。对于缓存失效,您真正需要的是一个CloudFront分发ID和一个要失效的文件列表。这是脚本

#!/usr/bin/env perl
use strict;
use warnings;
use Paws;
use Getopt::Long 'GetOptions';
use Time::HiRes 'gettimeofday';

GetOptions(
  'distribution-id=s' => \my $DISTRIBUTION_ID,
  'keys=s'            => \my @KEYS,
  'region=s'          => \my $REGION,
) or die 'unrecognized arguments';

die '--distribution-id and --region are required'
  unless $DISTRIBUTION_ID && $REGION;

# don't block on empty STDIN
STDIN->blocking(0);
@KEYS = map { chomp;"/$_" } @KEYS, <STDIN>;
die 'no objects to invalidate!' unless @KEYS;
printf "Invalidating cached keys: %s\n", join ', ', @KEYS;

my $cfront = Paws->service('CloudFront', region => $REGION);
my $uid    = join '-', gettimeofday();

$cfront->CreateInvalidation(
  DistributionId    => $DISTRIBUTION_ID,
  InvalidationBatch => {
      CallerReference => $uid,
      Paths           => {
        Quantity => scalar @KEYS,
        Items    => \@KEYS,
      }
  }
);

与之前一样,我使用Getopt::Long来处理命令行选项。脚本需要一个CloudFront分发ID和一个AWS区域字符串。--keys开关是可选的,因为脚本还可以从STDIN读取键。这个片段很奇怪

# don't block on empty STDIN
STDIN->blocking(0);
@KEYS = map { chomp;"/$_" } @KEYS, <STDIN>;

它将STDIN文件句柄设置为非阻塞模式。这样,如果脚本尝试从它读取时STDIN为空,它就不会阻塞。在下一条语句中,使用map将每个键前缀添加一个斜杠。这是CloudFront所必需的。

然后脚本创建一个Paws CloudFront对象,并使用Time::HiRes的gettimeofday函数计算一个便宜的唯一ID(它返回当前纪元的秒和微秒)。

my $cfront = Paws->service('CloudFront', region => $REGION);
my $uid    = join '-', gettimeofday();

最后,脚本调用CreateInvalidation方法将数据发送到AWS CloudFront

$cfront->CreateInvalidation(
  DistributionId    => $DISTRIBUTION_ID,
  InvalidationBatch => {
      CallerReference => $uid,
      Paths           => {
        Quantity => scalar @KEYS,
        Items    => \@KEYS,
      }
  }
);

组合工具

的s3-upload脚本将更新的键打印到STDOUT,而cf-invalid可以从STDIN读取键。这使得方便的链式调用

./s3-upload --files static --bucket example.com --region us-east-1 \
| ./cf-invalid --distribution-id e9d4922bd9120 --region us-east-1

并且因为脚本使用Getopt::Long,选项名称可以缩短

./s3-upload -f static -b example.com -r us-east-1 | ./cf-invalid -d e9d4922bd9120 -r us-east-1

或者,键(文件名)可以作为参数指定

./cf-invalid -d e9d4922bd9120 -r us-east-1 -k index.html -k about.html -k contact.html

这两个脚本都可以在Github上找到。


本文最初发布在PerlTricks.com上。

标签

David Farrell

David是一位专业程序员,他经常推文博客关于代码和编程艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?请通过在GitHub上打开问题或拉取请求来帮助我们。