SAA / ドメイン3 高パフォーマンスなアーキテクチャの設計
重要な内容
Amazon CloudFront
概要
は、世界各地のからコンテンツを配信するです。利用者に近い場所へコンテンツをすることで、遅延とへの負荷を軽減します。
主要技術
① オリジンとディストリビューション
は、、Application Load Balancer、、などをとして使用できます。ディストリビューションにドメイン名、証明書、配信方法を設定します。
② キャッシュ動作
パスパターンごとのビヘイビアで、許可するメソッド、、転送するヘッダー・Cookie・クエリ文字列などを制御します。キャッシュキーを必要最小限にすると、キャッシュヒット率を高められます。
TTLには最小TTL、デフォルトTTL、最大TTLの3つがあり、が返すCache-ControlやExpiresヘッダーとの関係で効き方が変わります。ここはキャッシュが効かない原因としてよく問われます。
| 設定 | 効くのはどんなときか | 判断ポイント |
|---|---|---|
| デフォルトTTL | オリジンがCache-ControlもExpiresも返さないとき | 既定値の0秒のままだと毎回オリジンへ取りに行きます。 |
| 最小TTL / 最大TTL | オリジンがCache-ControlやExpiresを返すとき | オリジンが指示した期間をこの範囲へ収めます。 |
| Cache-Control: max-age | オリジン側でキャッシュ期間を指示したいとき | オブジェクト単位で期間を変えられます。 |
| Cache-Control: no-store / no-cache | キャッシュさせたくないとき | エッジキャッシュを止めるため、配信を速くしたい要件とは逆向きです。 |
デフォルトTTLが0秒のままだと、Cache-Controlを付けていないオブジェクトは毎回オリジンへ到達します。ヘッダーを付けずにエッジキャッシュを効かせたい場合は、キャッシュポリシーのデフォルトTTLを要件に合う秒数へ変更します。のポリシーはアクセス制御の仕組みなので、キャッシュ期間の指定には使えません。
利用者が世界中に分散していると、地域ごとのリージョナルエッジキャッシュがそれぞれ同じオブジェクトをオリジンへ取りに行きます。Origin を有効にすると、オリジンの前にもう1層のキャッシュが入り、各地域からの取得を集約してヒット率を高め、オリジンの負荷を下げられます。Origin Shieldを通るリクエストには追加料金がかかります。
キャッシュできない動的なでも、キャッシュを無効にしたキャッシュビヘイビアでを前段に置くと、利用者に近いエッジで接続を終端し、オリジンとの接続を使い回してAWSのネットワーク経由で転送するため、遠い利用者への応答を速くできます。
Point
- TTL = Time To Live(生存時間) の略で、キャッシュを保持してよい期間です。
- max-age は「この秒数までは再取得しなくてよい」という指示です。
- 和訳
- Expire: 期限が切れる
- Weblio英和辞書「expire」
③ オリジンアクセス制御
にはOrigin Access Control()を使用し、を直接公開せず経由のアクセスだけを許可できます。署名付きURLや署名付きCookieは、限定公開コンテンツの配信に使用します。
やをオリジンにする場合、オリジンが公開されたままだとCloudFrontとを迂回して直接アクセスされます。インターネット向けのALBを残すなら、ALBのの送信元をCloudFrontのオリジン向けマネージドプレフィックスリスト(com.amazonaws.global.cloudfront.origin-facing)に限り、さらにCloudFrontが付けるカスタムヘッダーをALBのルールで確認すると、自社のディストリビューション経由のリクエストだけを通せます。オリジンを使えば、ALB、、EC2をに置いたままCloudFrontだけを入口にできます。
④ オリジングループ
プライマリとセカンダリのをグループ化すると、特定の障害応答時にセカンダリへできます。静的コンテンツの配信などで可用性を高められます。
⑤ 更新と無効化
を待たずにを更新する場合はInvalidationを使用します。頻繁に更新するコンテンツでは、ファイル名のも検討します。
「速く配信したいが、更新後に古い内容を見せたくない」という要件では、キャッシュ期間を短くする方向ではなく、長めのキャッシュ期間とリリース時のInvalidationを組み合わせます。普段はエッジで応答し、更新したパスだけを明示的に消せるため、ヒット率と鮮度を両立できます。Invalidationは一定件数を超えるとパスごとに課金されるため、消す対象を絞るか、ファイル名を変えるバージョニングを選びます。
| 更新の要件 | 選ぶ手段 | 判断ポイント |
|---|---|---|
| 更新直後から新しい内容を見せたい | Invalidation | 対象パスのキャッシュを即時に無効化します。 |
| 更新が頻繁で無効化の回数が増える | ファイル名のバージョニング | 別のキーになるため無効化が不要です。 |
| 更新がほぼないコンテンツ | 長いmax-age | への到達を減らせます。 |
⑥ セキュリティとエッジ処理
独自ドメインの配信では証明書を関連付けます。利用者との間はビヘイビアのビューワープロトコルポリシー (をHTTPSへリダイレクト、またはHTTPSのみ) で、CloudFrontとカスタムの間はオリジンプロトコルポリシー (HTTPSのみ) で、それぞれHTTPSを強制します。片方だけでは、もう一方の区間が平文のまま残ります。を組み合わせると、不審なリクエストをエッジで遮断できます。署名付きURLは個別ファイル、署名付きCookieは複数ファイルへの期限付きアクセスに向きます。
CloudFront Functionsは軽量で高頻度な処理、@Edgeはより複雑な処理に使います。キーへ不要なCookie、ヘッダー、クエリ文字列を含めるとキャッシュが細分化されるため、必要最小限にします。
Lambda@Edgeは、ビューワーリクエスト、オリジンリクエスト、オリジンレスポンス、ビューワーレスポンスの4つのタイミングで実行できます。オリジンレスポンスに関連付けると応答の本文そのものを加工できるため、デバイスに応じた画像のリサイズやフォーマット変換のように、返すコンテンツを作り替える処理をエッジで完結できます。CloudFront Functionsはビューワー側の2つのタイミングだけで動き、実行時間が非常に短い代わりに本文や外部通信を扱えません。
| 要件 | 選ぶ機能 | 判断ポイント |
|---|---|---|
| ヘッダーの書き換え、URLの正規化、簡単なリダイレクト | CloudFront Functions | ビューワー側で完結し、実行時間と費用を抑えられます。 |
| レスポンス本文の加工、画像変換、外部サービスへの問い合わせ | Lambda@Edge | オリジン側のタイミングを使え、本文とネットワークを扱えます。 |
| どのデバイスから来たかで応答を変えたい | CloudFront-Is-Mobile-Viewerなどのヘッダー | CloudFrontが付与する判定結果をオリジンや関数へ渡せます。 |
キャッシュポリシーでヘッダーをキャッシュキーへ含めると、そのヘッダーの値ごとに別のキャッシュを持てますが、コンテンツ自体が変換されるわけではありません。応答の中身を変えるのは、あくまでオリジンかLambda@Edgeです。
⚠️ 頻出: 「エッジで画像を変換して返したい」はLambda@Edge、「ヘッダーを書き換えたいだけ」はCloudFront Functionsです。
⑦ 料金とデータ転送の削減
は、エッジから利用者へのデータ転送(アウト)と/リクエストの件数に課金されます。、、などのAWSのからCloudFrontへの取得(オリジンフェッチ)には転送料金がかかりません。そのため、S3やEC2からインターネットへ直接配信している大量のダウンロードをCloudFront経由に変えると、オリジンからインターネットへの転送料金がなくなり、に当たった分はオリジンへの取得自体も減ります。
| 料金を抑える手段 | 仕組み | 判断ポイント |
|---|---|---|
| CloudFrontを前段に置く | AWSのオリジンからのオリジンフェッチは無料 | S3やEC2からインターネットへの直接配信の転送料金をなくせます。 |
| キャッシュヒット率を上げる | オリジンへの取得とオリジン側の処理を減らす | キャッシュキーを絞り、を適切に設定します。 |
| 価格クラスを絞る | 配信に使うを料金の安い地域に限る | 価格クラス100は北米、欧州、イスラエル、トルコ、価格クラス200はさらに南米とオセアニアを除く地域です。対象外の地域の利用者は遅延が増えます。 |
価格クラスは配信を止める機能ではなく、対象外の地域の利用者も、対象内のエッジから配信を受けられます(遅延は増えます)。特定の国からのアクセスを拒否したい場合は地理的制限を使います。
試験対策
① CloudFrontとGlobal Acceleratorの使い分け
コンテンツの、エッジ配信、負荷軽減にはを選びます。/通信をキャッシュせずAWSグローバルネットワークで最適化する場合はを選びます。
② 高可用な配信
やをにし、必要に応じてオリジングループでします。S3の非公開化にはを組み合わせます。
| 要件 | 選択肢 |
|---|---|
| 非公開S3から安全に配信 | + OAC |
| 有料会員向けの単一ファイル | 署名付きURL |
| 会員向けの複数ファイル | 署名付きCookie |
| を即時削除 | Invalidation |
| ヘッダーが無いオブジェクトをエッジでキャッシュ | キャッシュポリシーのデフォルト |
| 長くキャッシュしつつ更新後の鮮度も守る | 長いmax-age + リリース時のInvalidation |
| デバイスごとに画像を変換して返す | @Edge |
⚠️ 頻出: S3静的Webサイトと、非公開S3をOACで保護する構成は同じではありません。