AWS CloudFront + S3で静的コンテンツを配信する際のキャッシュ制御

2020年9月24日

キャッシュ制御の注意点

AWSで静的コンテンツ(HTML, JS, CSS, 画像など)を配信する際にCloudFront + S3の構成を用いることは多いと思います。
最近はSPA + APIでウェブアプリを開発することも増えてきているため、SPAの配信にCloudFront + S3を使用している方も多いのではないでしょうか。
この構成では考慮しなければいけないキャッシュは以下の2種類あります。

  • ブラウザキャッシュ
  • CloudFrontのエッジキャッシュ

これらのキャッシュが使用されることでブラウザ等のクライアントからのアクセス時のパフォーマンスは向上します。しかし、オリジンコンテンツの更新後も古いキャッシュが使用されるとクライアントは更新後のコンテンツを表示されません。


ここでの注意点はCloudFrontではキャッシュのTTLを設定できるが、この設定の対象はあくまでもCloudFrontのキャッシュであるということです。
そのため、ブラウザキャッシュを制御するためにはオリジンであるS3からのレスポンスにCache-Controlヘッダを付与する必要があります。

S3上のコンテンツに対するCache-Controlヘッダの設定方法

S3上のコンテンツにCache-Controlヘッダを追加するためには、各コンテンツのメタデータに追加する必要があります。メタデータの設定はコンソール上から設定することもできます。しかし、コンテンツ数が多くなると手作業で全て設定することは難しいです。

aws s3 metadata

AWS CLIを使用する方法もありますが、CodePipe Lineを作成しアクションプロバイダーとしてデプロイカテゴリのAmazon S3を使用すると簡単にCache-Controlヘッダを付与できます。

デプロイアクション中の追加設定→キャッシュコントロールオプションにCache-Controlヘッダの値を設定すればS3にデプロイされる全てのオブジェクトに対するCache-Controlヘッダの設定を行うことができます。

aws codepipeline s3 deploy

CloudFrontエッジキャッシュのTTL設定方法

aws cloudfront cache ttl

AWS CloudFrontのコンソール上からMinimum TTL, Maximum TTL, Default TTLの値を設定すればよいです。全て0にするとエッジキャッシュされなくなります。

AWS

Posted by fanfanta