如何使通过 Java AWS SDK 从 Cloudfront CDN 提供的文件(待刷新)无效?

How to invalidate a file(to be refreshed) served from Cloudfront CDN via Java AWS SDK?

我正在使用 Java SDK 将图像上传到 S3,如何使 CloudFront 中的文件无效,以便从 s3 来源重新获取它。如何通过 Java SDK 实现?

import com.amazonaws.services.cloudfront;
import com.amazonaws.services.cloudfront.model.CreateInvalidationRequest;
import com.amazonaws.services.cloudfront.model.Paths;
import com.amazonaws.services.cloudfront.model.InvalidationBatch;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;

AWSCredentials awsCredentials = new DefaultAWSCredentialsProviderChain().getCredentials();
AmazonCloudFrontClient client = new AmazonCloudFrontClient(awsCredentials);

Paths invalidation_paths = new Paths().withItems("/path/to/invalidate/foo.jpg", "/path/file2.txt").withQuantity(2);
InvalidationBatch invalidation_batch = new InvalidationBatch(invalidation_paths, "unique_id_like_a_date");
CreateInvalidationRequest invalidation = new CreateInvalidationRequest("distributionID", invalidation_batch);
CreateInvalidationResult ret = client.createInvalidation(invalidation);

请注意,您只能有 三个 个并发失效;失效似乎需要 10-30 分钟。

来自 AWS 文档:

对于每个正在进行的分配,一次最多可以有 3,000 个对象 URL 的失效请求,每个失效请求最多可以包含 3,000 个对象 URL。只要您不超过此限制,您就可以提出任意数量的无效请求。例如,您可以创建 30 个失效,每个失效 100 个对象,但只要所有 30 个失效仍在进行中,您就不能再创建任何失效。如果超出限制,CloudFront returns 一条错误消息。

CloudFront 通常需要 10 到 15 分钟才能完成您的失效请求,具体取决于您在请求中包含的对象 URL 的数量。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html

通过使用对象失效,我们实现了这一点。

对象失效 - 使分配中的对象失效以强制 CloudFront 从 S3 源获取最新的对象数据。

请参考这篇link, http://jets3t.s3.amazonaws.com/toolkit/code-samples.html#cloudfront-invalidation

使用 新的 AWS Java SDK 2.x,我已经成功地使一些路径无效:

        Paths invalidationPaths = Paths.builder()
                .items("/thing.txt", "/foo/bar/*")
                .quantity(2)
                .build();

        InvalidationBatch invalidationBatch = InvalidationBatch.builder()
                .paths(invalidationPaths)
                .callerReference("arcones")
                .build();

        CreateInvalidationRequest createInvalidationRequest = CreateInvalidationRequest.builder()
                .distributionId(distributionID)
                .invalidationBatch(invalidationBatch)
                .build();

        cloudFront.createInvalidation(createInvalidationRequest);

请记住,失效是异步的,因此当您 运行 执行此操作时,它将被发送到您的 CloudFront 分配,并且需要一段时间来处理(您会注意到失效已完成,当状态变为 Completed).

新更新:

import com.amazonaws.services.cloudfront;
import com.amazonaws.services.cloudfront.model.CreateInvalidationRequest;
import com.amazonaws.services.cloudfront.model.Paths;
import com.amazonaws.services.cloudfront.model.InvalidationBatch;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;

AWSCredentials awsCredentials = new DefaultAWSCredentialsProviderChain().getCredentials();

AmazonCloudFrontClient client =

                (AmazonCloudFrontClient) AmazonCloudFrontClientBuilder.standard()
                        .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)).build();


Paths invalidation_paths = new Paths().withItems("/path/to/invalidate/foo.jpg", "/path/file2.txt").withQuantity(2);
// unique_id_like_a_date = "20201001090000".
InvalidationBatch invalidation_batch = new InvalidationBatch(invalidation_paths, "unique_id_like_a_date");
CreateInvalidationRequest invalidation = new CreateInvalidationRequest("distributionID", invalidation_batch);
CreateInvalidationResult ret = client.createInvalidation(invalidation);