openplanning

Vô hiệu hoá bộ nhớ đệm của CloudFront với Java

  1. Thư viện
  2. CloudFront Invalidation
Như bạn đã biết, Amazon CloudFront là mạng phân phối nội dung (Content Delivery Network - CDN) cung cấp khả năng phân phối nội dung web tĩnh và động nhanh chóng và an toàn cho người dùng trên toàn thế giới. CloudFront có một tính năng gọi là vô hiệu hóa bộ đệm (cache invalidation), cho phép bạn xóa nội dung được lưu trong bộ nhớ đệm khỏi CDN để có thể phân phối nội dung mới tới người dùng.
Trong bài viết giới thiệu về Amazon CloudFront tôi đã giải thích về kiến trúc và cách mà CloudFront hoạt động. Nó giúp bạn hiểu lý do tại sao chúng ta phải vô hiệu hoá (invalidate) bộ đệm của CloudFront mỗi khi máy chủ gốc (origin server) được cập nhập dữ liệu mới.
Về cơ bản, bạn có thể vô hiệu hoá (invalidate) bộ nhớ đệm của CloudFront một cách thủ công trên AWS Management Console.
Trong bài viết này tôi sẽ hướng dẫn bạn sử dụng Java Awssdk CloudFront để vô hiệu hoá (invalidate) bộ nhớ đệm của CloudFront, điều này giúp ứng dụng của bạn có tính tự động hoá cao hơn.
Đầu tiên bạn cần viết một lớp tiện ích để tạo đối tượng CloudFrontClient.
MyUtils.java
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.cloudfront.CloudFrontClient;

public class MyUtils {

	public static CloudFrontClient createCloudFrontClient(Region region) {
		AwsCredentials credentials = AwsBasicCredentials.create("accessKeyId", "secretAccessKey");
		AwsCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(credentials);

		CloudFrontClient cloudFrontClient = CloudFrontClient.builder() //
				.credentialsProvider(credentialsProvider) //
				.region(region) //
				.build();

		return cloudFrontClient;
	}
}
Để tạo đối tượng CloudFrontClient bạn cần phải tạo một đối tượng AwsCredentialsProvider, đối tượng này cung cấp thông tin xác thực (Credentials) cho phép bạn tương tác với AWS. Xem thêm bài viết dưới đây để tạo một AwsCredentialsProvider phù hợp với mục đích sử dụng của bạn.

Thư viện

<!-- https://mvnrepository.com/artifact/software.amazon.awssdk/cloudfront -->
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>cloudfront</artifactId>
    <version>2.21.14</version>
</dependency> 

CloudFront Invalidation

Trên AWS Management Console bạn có thể tìm thấy "Distribution ID" tương ứng với bản phân phối nội dung (Content Distribution) của bạn.
Ví dụ, sử dụng Java Awssdk CloudFront để vô hiệu hoá bộ nhớ đệm trên một CloudFront Distribution.
CloudFrontInvalidationUtils.java
package org.o7planning.java_14203_awssdk_cloudfront;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import org.o7planning.awssdkcloudfront.MyUtils;

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.cloudfront.CloudFrontClient;
import software.amazon.awssdk.services.cloudfront.model.CreateInvalidationRequest;
import software.amazon.awssdk.services.cloudfront.model.CreateInvalidationResponse;
import software.amazon.awssdk.services.cloudfront.model.InvalidationBatch;
import software.amazon.awssdk.services.cloudfront.model.Paths;

public class CloudFrontInvalidationUtils {

	// @invalidationPaths: /thing.txt, /foo/bar/*
	public static void sendInvalidation(Region region, //
			String cloudFrontDistributionId, String... invalidationPaths) {
		CloudFrontClient cloudFrontClient = MyUtils.createCloudFrontClient(region);

		Paths paths = Paths.builder() //
				.items(invalidationPaths) //
				.quantity(invalidationPaths.length) //
				.build();

		// Unique ID like a date: "20201001090000"
		LocalDateTime now = LocalDateTime.now();
		String referenceUniqueId = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
		System.out.println("Invalidation referenceUniqueId: " + referenceUniqueId);
		//
		InvalidationBatch invalidationBatch = InvalidationBatch.builder() //
				.paths(paths) //
				.callerReference(referenceUniqueId) //
				.build();

		CreateInvalidationRequest createInvalidationRequest = CreateInvalidationRequest.builder()
				.distributionId(cloudFrontDistributionId) //
				.invalidationBatch(invalidationBatch) //
				.build();

		CreateInvalidationResponse response = cloudFrontClient.createInvalidation(createInvalidationRequest);
		System.out.println("Invalidation Result: " + response);
		System.out.println("Invalidation Done!");
	}
}
InvalidationExample1.java
package org.o7planning.java_14203_awssdk_cloudfront;

import software.amazon.awssdk.regions.Region;

public class InvalidationExample1 {

	// EU (Frankfurt) - Germany
	private static final Region myCloudFrontRegion = Region.EU_CENTRAL_1;

	private static final String myDistributionId = "Your-Distribution-ID";

	public static void main(String[] args) {
		String[] invalidationPaths = new String[] { //
				"/*" // All Paths
		};
		CloudFrontInvalidationUtils.sendInvalidation( //
				myCloudFrontRegion, // Distribution Regions
				myDistributionId, // Distribution ID
				invalidationPaths // Invalidation Paths
		);
	} 
}

Các hướng dẫn Amazon Web Services

Show More