Q3 — AWS SAA-C03 第13章
第 3/100 問 | ← 第13章
Q903. ある企業は、Amazon S3上で高トラフィックの静的ウェブサイトをホストしており、デフォルトTTLが0秒のAmazon CloudFrontディストリビューションを使用しています。この企業は、ウェブサイトのパフォーマンス向上のためキャッシュを実装したいと考えています。ただし、デプロイ後に数分以上経過した「古くなった(stale)」コンテンツが提供されないようにすることも求められています。これらの要件を満たすために、ソリューションズアーキテクトが実装すべきキャッシュ手法の組み合わせはどれですか?(2つ選択してください。)
- A. CloudFrontのデフォルトTTLを2分に設定する。 ✓
- B. S3バケットに2分のデフォルトTTLを設定する。
- C. Amazon S3内のオブジェクトにCache-Control privateディレクティブを追加する。 ✓
- D. HTTPレスポンスにExpiresヘッダーを追加するAWS Lambda@Edge関数を作成する。この関数をviewer responseイベントで実行するように設定する。
- E. Amazon S3内のオブジェクトにCache-Control max-ageディレクティブ(24時間)を追加する。デプロイ時に、変更されたファイルをエッジキャッシュから削除するためのCloudFront無効化(invalidation)を実行する。
正解: A. CloudFrontのデフォルトTTLを2分に設定する。, C. Amazon S3内のオブジェクトにCache-Control privateディレクティブを追加する。
解説
ウェブサイトのパフォーマンス向上と、デプロイ後数分以内に古くなったコンテンツが提供されないという要件を同時に満たすには、以下の2つのキャッシュ手法が適しています。 A. CloudFrontのデフォルトTTLを2分に設定する。 CloudFrontのデフォルトTTL(Time-to-Live)を2分に設定すると、CloudFrontはコンテンツを最大2分間キャッシュします。これにより、同一コンテンツへの後続リクエストは2分間のウィンドウ内でCloudFrontのキャッシュから提供されるため、パフォーマンスが向上します。また、2分経過後にはCloudFrontがオリジン(この場合はS3バケット)を再確認し、変更があれば最新のコンテンツを取得します。 C. Amazon S3内のオブジェクトにCache-Control privateディレクティブを追加する。 S3内のオブジェクトにCache-Control privateディレクティブを設定すると、各オブジェクト単位でキャッシュ動作を制御できます。privateディレクティブは、そのコンテンツがブラウザでキャッシュ可能である一方、CloudFrontなどの中間キャッシュ(intermediate caches)ではキャッシュしないことを示します。これにより、ブラウザ側でのキャッシュによるパフォーマンス向上が図られるとともに、CloudFrontは常にオリジンを確認して最新のコンテンツを取得するようになります。 選択肢Bは、S3バケット自体にTTLを設定する方法ですが、S3はHTTPキャッシュ制御ヘッダー(例:Cache-ControlやExpires)を自動的に付与しません。また、CloudFrontのキャッシュ動作はS3バケットの設定ではなく、CloudFront自身のキャッシュポリシーまたはS3オブジェクトに埋め込まれたHTTPヘッダーによって制御されます。したがって、Bは不適切です。 選択肢Dは、Lambda@Edgeを使ってExpiresヘッダーを動的に挿入する手法ですが、Expiresは古いキャッシュ制御メカニズムであり、現在はCache-Controlヘッダーの使用が推奨されています。さらに、Lambda@Edgeの導入は不要な複雑さとオーバーヘッドを招くため、本要件には最適ではありません。 選択肢Eは、max-age=24時間とCloudFront無効化を組み合わせる手法ですが、無効化は非同期処理であり、完了までに数分〜数十分かかる場合があり、「数分以内に古くなったコンテンツを防止する」という要件を確実に満たせません。また、頻繁なデプロイに対して無効化を多用するとコストと運用負荷が増大するため、推奨されません。 以上より、要件を満たす最も適切な組み合わせは、選択肢Aと選択肢Cです。