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

时间:2015-02-15 14:40:22

标签: java amazon-web-services amazon-cloudfront

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

5 个答案:

答案 0 :(得分:9)

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分钟。

答案 1 :(得分:2)

来自AWS文档:

您可以同时为每个正在进行的分发提供最多3,000个对象网址的无效请求,每个无效请求最多可包含3,000个对象网址。只要不超过此限制,您就可以根据需要制作尽可能多的失效请求。例如,您可以创建30个失效,每个失效使100个对象无效,但只要所有30个失效仍在进行中,您就不能再创建失效。如果超出限制,CloudFront将返回错误消息。

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

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

答案 2 :(得分:0)

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

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

请参阅此链接, http://jets3t.s3.amazonaws.com/toolkit/code-samples.html#cloudfront-invalidation

答案 3 :(得分:0)

使用新的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发行版中,并且将需要一段时间来处理(您可以注意到,失效状态为{{1}时,失效已完成) }。

答案 4 :(得分:0)

新更新:

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);