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(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
資格:少額短期保険募集人,FP3級,宅建士
コメント