问题可能出在 CloudFront 对 S3 访问的缓存设置上。为了解决这个问题,我们可以采用以下两种方法之一:
可以在 CloudFront 缓存选项中设置缓存过期时间为 0,这样 CloudFront 就不会从缓存中获取内容,而是每次都从 S3 中读取最新的内容。例如,使用 AWS SDK 的 Java 版本,可以这样写代码:
DistributionConfig distributionConfig = cloudFrontClient.getDistributionConfig(new GetDistributionConfigRequest(distributionId));
// 禁用缓存
distributionConfig.withDefaultCacheBehavior(distributionConfig.getDefaultCacheBehavior().withMinTTL(0).withMaxTTL(0));
UpdateDistributionRequest updateDistributionRequest = new UpdateDistributionRequest(distributionId, distributionConfig);
UpdateDistributionResult updateDistributionResult = cloudFrontClient.updateDistribution(updateDistributionRequest);
可以通过给 S3 上的文件添加版本号或查询参数等方式,来覆盖原有的文件,从而使 CloudFront 更新缓存中的文件。例如,可以在文件名后面加上版本号(如 "example.jpg?v=1")或查询参数(如 "example.jpg?version=1"),并通过这个版本号或查询参数来强制刷新 CloudFront 缓存。例如,使用 AWS SDK 的 Java 版本,可以这样写代码:
CreateInvalidationRequest createInvalidationRequest = new CreateInvalidationRequest(distributionId, new InvalidationBatch().withPaths(new Paths().withItems("/example.jpg").withQuantity(1)).withCallerReference("example.jpg"));
CreateInvalidationResult createInvalidationResult = cloudFrontClient.createInvalidation(createInvalidationRequest);
以上代码示例仅供参考,具体实现可能与您的项目有所不同,具体细节请参阅相关文档。