版本控制如何在 Amazon Cloudfront 上工作?

How does versioning work on Amazon Cloudfront?

我刚刚在 Amazon S3 上建立了一个静态网站。我也在使用 Cloudfront CDN 服务。

据亚马逊称,有两种方法可用于清除 Cloudfront 缓存:失效和版本控制。我的问题是关于后者的。

考虑以下示例:

我从我的 index.html 文件 link 到图像文件 (image.jpg)。然后我决定更换图像。我用文件名上传第二张图片:image_2.jpg 并更改 index.html 文件中的 link。

更改会自动生效还是需要采取进一步措施?

如果已编辑和新上传的文件位于存储桶中而不是缓存中,什么会触发必要的更改?

您的云端配置有一个缓存 TTL,它会告诉您文件何时更新,而不管源何时更改。

如果您需要立即更新,请在您的 index.html 文件上使用失效功能

CloudFront 中的版本控制只不过是在对象名称中添加(或添加前缀)版本或 'folder' 存储对象的位置。

  • 文件夹 v1 中的所有对象并使用 URL 之类的 https://xxx.cloudfront.net/v1/image.png
  • 所有对象都在其名称中包含一个版本,例如 image_v1.png,并使用 URL,例如 https://xxx.cloudfront.net/image_v1.png

第二个选项通常需要更多工作,但您不需要上传不需要更新的新文件(=在存储环境中更便宜)。第一个解决方案通常更清晰,需要的工作更少。

使用 CloudFront 版本控制需要更多 S3 存储空间,但通常比创建许多失效更便宜。

另一种使缓存失效的方法是创建失效(可能很昂贵)。如果您真的不需要失效,而只是需要更快速的缓存刷新(默认 24 小时),那么您可以更新原始 TTL 设置(原始级别)或设置单个对象的缓存持续时间(对象级别)。

我会插话,以防其他人来这里寻找我所做的事情。您可以在启用 S3 版本控制的情况下设置 Cloudfront,如果您知道需要哪个版本,则可以参考特定的 S3 版本。我把它放在预签名的 Cloudfront URL 后面,并在 Java SDK 中结束:

    S3Properties s3Properties... // Custom properties pulled from a config file
    String cloudfrontUrl = "https://" + s3Properties.getCloudfrontDomain() + "/" + 
            documentS3Key + "?versionId=" + documentS3VersionId;

    URL cloudfrontSignedUrl = new URL(CloudFrontUrlSigner.getSignedURLWithCannedPolicy(
            cloudfrontUrl,
            s3Properties.getCloudfrontKeypairId(),
            SignerUtils.loadPrivateKey(s3Properties.getCloudfrontKeyfilePath()),
            getPresignedUrlExpiration()));