← ハンズオン一覧に戻る

AWS Hands-on / Content Delivery

世界中に届く前に、キャッシュを使いこなす

CloudFront は一度配信したコンテンツをエッジロケーションにキャッシュし、次のリクエストに素早く応答します。S3 の静的サイトをオリジンに、ファイルを更新しても古い内容が表示され続ける状態と、キャッシュ無効化で最新の内容に切り替わる様子を体験します。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 40〜60 分 コンソール+ブラウザの開発者ツール
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須S3バケットの作成・ファイルのアップロードをしたことがある
  • あると良いブラウザの開発者ツール(ネットワークタブ)を開いた経験

※ コンソールとブラウザの操作だけで完結します。コマンドラインでのヘッダー確認は任意の代替手順として紹介します。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

CloudFront は、一度取得したコンテンツをエッジロケーションに一時的に保存(キャッシュ)しておくことで、次に同じファイルがリクエストされたとき、オリジンまで取りに行かずに素早く返せる仕組みです。便利な仕組みですが、「オリジンのファイルを更新したのに、表示される内容が古いまま」という状況に最初は驚く人も多くいます。

これは、CloudFront がまだ古いバージョンをキャッシュに保持しているために起こります。今回はS3静的サイトをオリジンにしたシンプルなCloudFront配信を作り、まずファイルを更新しても古い内容のままキャッシュされ続ける状態を確認し、その後「キャッシュ無効化」を実行して最新の内容に切り替わることを確認します。

TTLを0にすれば、いつでも最新のファイルが届くようになるの?

TTLを短く(または0に近く)設定すれば、キャッシュされる時間が短くなり、最新のファイルが届きやすくなります。ただしその分オリジンへのリクエストが増えるため、本来キャッシュが持つ「高速化」「オリジンの負荷軽減」というメリットが薄れます。更新頻度と速度のバランスを考えて設定する、という考え方がポイントです。

ファイルを更新するたびに、毎回キャッシュ無効化が必要なの?

1つの方法です。もう1つの方法として、ファイル名自体を変える(バージョニングしたファイル名にする、例:style.v2.css)ことで、古いファイルと新しいファイルを別のURLとして扱い、無効化を使わずに済ませる方法もあります。頻繁に更新するファイルには、こちらの方法がすすめられることもあります。

Goal

S3静的サイトをオリジンにしたCloudFront配信を作成し、オリジンのファイルを更新してもキャッシュされた古い内容が表示され続けることを確認したうえで、キャッシュ無効化を実行して最新の内容に切り替わることを確認する。

04 — Architecture

つくる構成

同じCloudFrontディストリビューション・同じオリジンのまま、キャッシュ無効化を実行する前後で、表示される内容がどう変わるかを比較します。

Before — キャッシュ無効化前

古い内容のまま

🌐 ブラウザ ⚡ CloudFrontエッジ(旧バージョンをキャッシュ中) オリジンには行かない
更新前のファイルが表示され続ける
After — キャッシュ無効化後

最新の内容に切り替わる

🌐 ブラウザ ⚡ CloudFrontエッジ(キャッシュ削除済み) 🪣 オリジンS3から再取得
更新後のファイルが表示される

※ オリジンのS3バケットの内容は、Before・Afterどちらも同じ(更新後)です。違いはCloudFront側のキャッシュ状態だけです。

05 — Requirements

要件

以下の要件を満たし、「古いまま」→「無効化」→「最新に切り替わる」という変化を確認してください。

No要件
1S3バケットを1つ作成し(東京リージョン、名前は一意に、例:cf-cache-demo-yourname)、シンプルな index.html を1つアップロードして、パブリックに読み取れる状態にする。
2このバケットをオリジンにしたCloudFrontディストリビューションを作成する(オリジンアクセスはパブリックのまま(OACなし)でよい)。
3CloudFrontのドメイン名でアクセスし、ページが表示されることを確認する。
4index.htmlの内容を書き換えて再アップロードし、CloudFront経由でアクセスすると古い内容のまま表示されることを確認する。
5パス/*を対象にキャッシュ無効化を実行し、完了後にもう一度アクセスして最新の内容が表示されることを確認する。
06 — Steps

構築の進め方

「オリジンを作る」→「CloudFront配信を作る」→「古いキャッシュを確認する」→「無効化して切り替える」という順番で進めます。

  1. フェーズ1 — シンプルなオリジンを用意する
  2. マネジメントコンソールにサインインし、リージョンを合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  3. S3バケットを作成し、シンプルなページを公開する

    S3コンソールでバケットを1つ作成します(名前は一意に、例:cf-cache-demo-yourname)。「パブリックアクセスをブロック」を解除し、index.html(例:見出しだけのシンプルなHTML)をアップロードして、s3:GetObjectPrincipal: *に許可するバケットポリシーを設定します。

    学習目的の一時的な公開設定

    今回はCloudFrontのキャッシュ動作に焦点を当てるため、オリジンの公開設定はシンプルにしています。検証が終わったら、後片づけでバケットごと削除します。

  4. フェーズ2 — CloudFront配信を作る
  5. CloudFrontディストリビューションを作成する

    CloudFrontコンソールで「ディストリビューションを作成」を選び、オリジンに手順2のバケットを指定します。オリジンアクセスは「パブリック」のままで構いません(OACは設定しません)。キャッシュビヘイビアのキャッシュポリシーはデフォルト(CachingOptimizedなど)のままにします。

  6. デプロイ完了を待ち、表示を確認する

    ディストリビューションのステータスが「デプロイ済み」になったら、表示されているドメイン名(例:d111111abcdef8.cloudfront.net)にアクセスし、ページが表示されることを確認します。

  7. フェーズ3 — 古いキャッシュが残る様子を確認する
  8. index.htmlの内容を書き換えて再アップロードする

    ローカルでindex.htmlの見出しなどの文言を変更し、同じファイル名でS3に再アップロードします。

  9. CloudFront経由でアクセスし、古い内容のままであることを確認する

    CloudFrontのドメイン名にもう一度アクセスします。ブラウザのシークレットウィンドウや別のブラウザで開いても、更新前の内容のまま表示されることを確認します。

    ブラウザのキャッシュではない

    シークレットウィンドウや別のブラウザで開いても古いままなのは、ブラウザ側のキャッシュではなく、CloudFrontのエッジロケーション側にまだ古いバージョンがキャッシュされているためです。S3バケットへ直接アクセスすれば最新の内容が見られることでも確認できます。

  10. フェーズ4 — キャッシュを無効化して切り替える
  11. キャッシュ無効化リクエストを作成する

    CloudFrontコンソールのディストリビューション詳細で「無効化」タブを開き、「無効化を作成」を選びます。オブジェクトパスに/*を指定して作成します。

  12. 無効化の完了を待ち、最新の内容を確認する

    無効化リクエストのステータスが「完了」になったら、もう一度CloudFrontのドメイン名にアクセスします。

    これがゴール

    さきほど古いまま表示されていたページが、今度は最新の内容で表示される——この変化を確認できたら、このハンズオンの目的は達成です。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直すか」の手がかりとして使ってください。

Pitfall 01 — ブラウザのキャッシュと混同してしまう

「ハード再読み込みしたのに、まだ古いまま」

ブラウザの再読み込みをいくら強く行っても、CloudFront側のキャッシュには影響しません。シークレットウィンドウ・別ブラウザ・curlコマンドなど、ブラウザキャッシュの影響を受けない方法で確認する視点を持ちましょう。

Pitfall 02 — 無効化してもまだ古いまま表示される

「無効化したのに、内容が変わらない」

無効化リクエストのステータスが本当に「完了」になっているかを見直しましょう。完了までには数分程度かかります。また、指定したパスに対象のファイルが含まれているか(/*であれば通常は問題ありません)も確認しましょう。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。

  • CloudFrontのドメイン名にアクセスでき、最初のページが表示される。
  • index.html更新後、無効化前は古い内容のまま表示される(シークレットウィンドウなど複数の方法で確認済み)。
  • 無効化リクエストのステータスが「完了」になっている。
  • 無効化後にアクセスすると、最新の内容が表示される。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. キャッシュという仕組みがなく、CloudFrontが毎回オリジンに問い合わせる構成だったら、どんな問題が起きそうでしょうか。
    ヒント
    オリジンへのアクセスが増えることで生じる、応答速度やオリジン側の負荷について考えてみましょう。「キャッシュがあることで何が省略されているか」がヒントです。
  2. ファイル名を変える方式(バージョニング)と、キャッシュ無効化、それぞれどんな場面に向いているでしょうか。
    ヒント
    無効化には料金がかかる場合があり、反映にも数分かかります。頻繁に更新するファイルと、まれにしか更新しないファイルで、向き不向きがどう変わるか考えてみましょう。
  3. 本番運用で、無効化のリクエスト回数を減らす(コストを抑える)には、どのような工夫が考えられるでしょうか。
    ヒント
    個別のファイルを指定して無効化する方法と、ワイルドカード(/*)で広い範囲を無効化する方法では、料金の数え方にどんな違いがあるか調べてみましょう。
10 — Clean up

後片づけ

作成したリソースを順番に削除します。

  1. CloudFrontディストリビューションを無効化する:ディストリビューションを選び、「無効化」を実行します(削除の前に無効化が必要です)。
  2. 無効化が完了したらディストリビューションを削除する:状態が「無効」になったら削除します。
  3. S3バケットを空にして削除する:バケットの中のオブジェクトをすべて削除してから、バケット本体を削除します。
Caution — 削除には少し時間がかかる

ディストリビューションの無効化・削除はすぐには終わらない

CloudFrontディストリビューションの無効化には数分〜十数分程度かかることがあります。無効化が完了するまで削除ボタンは使えない場合があるため、焦らず完了を待ちましょう。

コストに関する注意: CloudFrontのデータ転送・リクエストには無料利用枠があります。キャッシュ無効化は、月あたり1,000パスまで無料で、それを超えると1パスごとに料金がかかります(今回のように数回実行する程度であれば無料枠の範囲内です)。S3の保存容量・リクエストにも別途料金がかかりますが、少量であれば無料利用枠の範囲内に収まることが多いです。検証が終わったら、上の「後片づけ」に沿って忘れずに削除しましょう。最新の料金は AWS の公式料金ページで確認してください。