AWS CloudFrontでエッジサーバのキャッシュを無効化する方法
CloudFront + S3という構成でウェブホスティングしているとします。CDNを利用すれば近くのエッジサーバにキャッシュされるので、ウェブブラウズが早くなりますが、要件によってキャッシュさせたくない場合があると思います。
例)顔画像などを海外エッジサーバに保存することが個人情報保護法に抵触する可能性があるケース
CloudFrontでキャッシュ無効化する手順です。
S3でウェブホスティング
S3にindex.htmlでも配置してホスティングします。
キャッシュ無効化する際にS3のバケット自体のメタデータに以下を追加する必要があります。
| ヘッダ | 値 |
|---|---|
| Cache-Control | no-store |
no-storeをメタデータで指定しておけば一切キャッシュしません。no-cacheではないので注意です。
実際はCloudBerry Explorerを使用しないとバケット単位にメタデータは設定できないのでオブジェクト(ここではindex.html)にメタデータを設定します。
CloudFrontの設定
CloudFrontの設定をします。S3と紐づけますが割愛します。
主にTTLを0にするという設定です。
最後に「Create Distribution」ボタンを押して作成します。※20分ほどかかります
上記画面のDomain Name欄のxxx.cloudfront.netをコピーして、xxx.cloudfront.net/index.htmlにブラウザからアクセスします。
こんな感じでアクセスできたらOKです。
キャッシュされていないことの検証
キャッシュされているかどうかは、ヘッダ情報のX-Cacheで判断ができます。
| X-Cache | 意味 |
|---|---|
| Hit from cloudfront | キャッシュされている |
| RefreshHit from cloudfront | キャッシュされているがTTL切れ |
| Miss from cloudfront | キャッシュされていない |
$ curl --head http://d3gti842iotdf5.cloudfront.net/index.html HTTP/1.1 200 OK Content-Type: text/html Content-Length: 50 Connection: keep-alive Date: Tue, 17 Dec 2019 11:54:13 GMT Last-Modified: Tue, 17 Dec 2019 11:31:12 GMT ETag: "38a2d183f196b2787fdcde102cc457fc" Cache-Control: no-store Accept-Ranges: bytes Server: AmazonS3 X-Cache: Miss from cloudfront ← ここ Via: 1.1 71c0bff02d86d03bc100194555d98854.cloudfront.net (CloudFront) X-Amz-Cf-Pop: NRT51-C2 X-Amz-Cf-Id: yXn1rYYVVlUHI5BsV9u0621-PO10DwX96xtDTDVl6JAZExklLq2a1w==
curlコマンドを何度叩いてもMiss from cloudfrontであれば、キャッシュ無効化されていることの確認ができます。
S3にアップロードする際にメタデータでキャッシュしないようにする
S3にアップロードする際にObjectMetaData#setCacheControlメソッドで”no-store”を指定すれば、キャッシュされません。
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class Sample1 {
public static void main(String[] args) {
Regions clientRegion = Regions.DEFAULT_REGION;
String bucketName = "hogebucket";
String keyName = "test/test.json";
String filePath = "test.json";
try {
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider("default"))
.build();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setCacheControl("no-store");
PutObjectRequest putRequest =
new PutObjectRequest(bucketName, keyName, new File(filePath));
putRequest.setMetadata(metadata);
PutObjectResult putResult = s3Client.putObject(putRequest);
} catch (AmazonServiceException e) {
e.printStackTrace();
} catch (SdkClientException e) {
e.printStackTrace();
}
}
}
参考サイト

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^





コメント