使用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上。
标签
反馈
这篇文章有什么问题吗?请通过在GitHub上打开问题或拉取请求来帮助我们。
- More commenting... maybe?
github.polettix.it - Perl Weekly Challenge 121: Invert Bit
blogs.perl.org - Web nostalgia: MojoX::Mechanize
github.polettix.it - On the eve of CPAN Testers
blogs.perl.org - PWC121 - The Travelling Salesman
github.polettix.it - PWC121 - Invert Bit
github.polettix.it - Floyd-Warshall algorithm implementations
github.polettix.it - Perl Weekly Challenge 120: Swap Odd/Even Bits and Clock Angle
blogs.perl.org - How I Uploaded a CPAN Module
blogs.perl.org - App::Easer released on CPAN
github.polettix.it