♣️

図解で理解するAmazon CloudFront

に公開

Amazon CloudFrontとは

Content Delivery Network( CDN )の機能を持つマネージドサービス。CloudFrontをシステムで利用することで、クライアントへのコンテンツの高速配信を実現可能。

CDNとは

Webサイトのコンテンツをユーザーにより高速かつ安定して届けるための配信ネットワーク。CDNはオリジンサーバエッジ(キャッシュ)サーバで構成される。

🟩 オリジンサーバ:コンテンツを配信するサーバのこと。(Webサーバ、APサーバ)
🟪 エッジサーバ:オリジンサーバのコンテンツの一部を一時的に保持するサーバ

使用の流れ

  1. クライアントはシステムへアクセスする際に、エッジサーバにアクセス
  2. エッジサーバの中にリクエストされたコンテンツがあれば、そのままクライアントに返却
  3. もしエッジサーバになければ、オリジンサーバからコンテンツを取得し、クライアントに配信
  4. この時取得したコンテンツはキャッシュサーバに格納

CloudFrontの全体像

ビューワー:クライアントとなる対象
ビューワーリクエスト・レスポンス:ビューワーとCloudFrontとの間
オリジンリクエスト・レスポンス:CloudFrontとオリジンの間

CloudFrontの構成要素

CloudFrontでは以下の構成要素を設定

ディストリビューション

キャッシュ対象とするドメイン単位で作成する設定のこと。
以下2つのタイプのディストリビューション

  • Webディストリビューション:HTMLリソースなどの静的コンテンツを対象
  • RTMPディストリビューション:動画などのストリームデータを対象

ディストリビューションを作成すると、エッジサーバを指し示す「xxxx.cloudfront.net」がドメイン名として生成。

オリジン

オリジンサーバとの接続に関する設定を行う。オリジンサーバとはキャッシュ対象となるコンテンツの元となるデータを持つサーバ。オリジンには、Web/APサーバのドメイン名を直接指定したり、S3やALBなどのAWSリソースを指定可能。

オリジンへの設定

  • パスカスタムヘッダの設定
  • Origin Sheild:オリジンへのアクセス頻度を最適化
  • Origin Access Identity:S3のバケットアクセスをCloudFrontからのみに限定してセキュリティ性を高める

ビヘイビア

エッジサーバの振る舞いに関する設定を行う。オリジンに設定したパスパターンごとに、ビューワーとのプロトコル設定(ビューワープロトコルポリシー)やキャッシングルール(キャッシュポリシー)を設定可能。

キャッシュの基本

キャッシュとは

一時取得したコンテンツを一時的に保存し、再利用する仕組み
CloudFrontにおいては、エッジロケーションがオリジンから取得したレスポンスをキャッシュし、次回以降の同じリクエストに対して、オリジンへアクセスせずに高速に応答可能。
どのリクエストがキャッシュの対象となるか、どのキャッシュが再利用されるかは、「キャッシュキー」によって決まる。

キャッシュキーとは

CloudFrontが「キャッシュを再利用できるかどうか」を判断するための識別情報のセット。
リクエストが来た時に、まず「同じキャッシュがすでにあるか」をチェックする。その判断基準になるのがキャッシュキー

例でイメージ

1. GET /item?lang=ja
2. GET /item?lang=en
  • キャッシュキーに「クエリ文字列(?lang=)」を含める設定なら違うキーのため、別々にキャッシュ
    日本語(ja)のの人には日本語、英語(en)の人には英語のページが返却
  • 含めない設定なら同じキーとして同じキャッシュが使われる
    キャッシュキーが「URLパスのみ」の場合、どちらのリクエストも同じキャッシュを使い、英語の人に日本語のページが返却される可能性がある

CloudFrontで使用する2種類のポリシー

キャッシュポリシー

CloudFrontがコンテンツをキャッシュする条件を定義する設定
リクエスト内容が異なると、別のキャッシュを使う or 新しく取得されることになる。

以下キャッシュポリシーで指定できる主な項目

項目 説明
クエリ文字列 例:?id=123など、指定することでキャッシュキーに含められる。
HTTPヘッダー ユーザーエージェントや言語などでキャッシュを分けたい時などに使用
Cookie ユーザー状態に応じたキャッシュ制御が可能
TTL設定 最小TTL・最大TTL・デフォルトTTLを指定してキャッシュ期間を調整

オリジンリクエストポリシー

オリジンサーバー(例:S3やAPI Gatewayなど)にリクエストを転送する際に、どの情報を含めるかを指定する設定。

以下オリジンリクエストポリシーで指定できる主な項目

項目 説明
クエリ文字列 例:?id=123をオリジンに送るかどうか
HTTPヘッダー 例:User-AgentAuthorizatonを送るかどうか
Cookie クライアントのCookieをオリジンに渡すか

キャッシュ設定

キャッシュコントロール

キャッシュは、URLやヘッダ・クエリ・Cookieの一致条件を指定して再利用可能。このようなキャッシュをどう扱うかを指示する設定を「キャッシュコントロール」という。
キャッシュコントロールは通常HTTPレスポンスヘッダの「Cache-Control」をコンテンツを提供するオリジンサーバ側で指定することにより、コンテンツ単位でのキャッシュコントロールを行う。
加えて、CloudFrontのビヘイビアで設定したTTL(Time To Live)の値によって、キャッシュの挙動は変化する。

キャッシュの無効化

CloudFrontでは、有効期限が切れる前にキャッシュされているコンテンツを無効化することが可能コンソール上やCLIを利用し、キャッシュを無効化する。ワイルドカードを用いて、複数のファイルを同時に無効化することも可能。

CloudFrontの重要な機能

通信の暗号化

CloudFrontでは、ビューワ⇄CloudFront間の通信は基本的に暗号化する。暗号化に使用する証明書は、cloudfront.netドメインのSSL/TLS証明書を標準で使用できるほか、AWS Certification Managerで発行された独自の証明書を設定することも簡単に可能。
CloudFront⇄オリジン間通信の暗号化も可能。AWSリソースへはデフォルトで暗号化され、カスタムオリジンでもオプションで選択できる。

ビューワー接続設定で、「制限付きアクセスオプション」を選択することで、利用可能。署名付きURLとCookieはどちらもビューワーに一時的なアクセス許可を付与する。
🟪 署名付きURL:特定の1つのコンテンツに対してアクセスを制限可能
🟩 署名付きCookie:Cookieを持つユーザーが有効期限内であれば、複数のコンテンツにアクセス可能

フィールドレベルの暗号化

クレジットカード番号やセキュリティ秘匿データなどサーバー側のログに残さないようにする場合の機能。ビューワーからのPOSTリクエストに含まれる特定のリクエストパラメータを暗号化する。

AWS WAFやAWS Shieldとの連携

インターネット外部からの脆弱性を狙った攻撃や膨大なトラフィックを送信する攻撃に対して、AWS WAFで定義したWeb ACLと、DDoS攻撃を緩和するAWS SheildをCloudFrontディストリビューションに適用可能

ファイル圧縮

Amazon S3オリジンとカスタムオリジンの両方のファイルをGzip/Brotli形式で圧縮してビューワーに送信可能。コンテンツを圧縮すると、ダウンロード時間を短縮できる。

オリジンフェイルオーバー

オリジンは複数作成でき、プライマリオリジンセカンダリオリジンをまとめたオリジングループを作成可能。オリジングループでは、5xx系など指定したHTTPステータスエラーが発生した際に、別のオリジンへフェイルオーバーするよう構成することもできる。

地理制限(ホワイトリスト/ブラックリスト)

CloudFrontではビューワーのIPアドレスなどから地域情報を判断し、アクセス制御可能。
ホワイトリストもしくはブラックリスト形式で指定可能。アクセス制御はディストリビューション全体に適用される。

Lambda@Edge

CloudFrontのエッジサーバで動作するLambda関数。コンテンツの整形や、オリジンサーバーが持つビューワー固有の情報を使用しない動的なページの作成など、UXを向上させる処理を実行。ビューワーリクエストオリジンリクエストオリジンレスポンスビューワーレスポンスにそれぞれ関連づけてLambda関数を実行可能。

🐣 ビューワーリクエスト

ビューワーからCloudFrontがリクエストを受信した時に実行される処理。
以下のような処理が可能

  • A/Bテストのため、リクエストのURLを変更して異なるオリジンに振り分け
  • Authorizationヘッダに含まれているトークンの検証・アクセス制御
  • User-Agentに応じてスマホ用・PC用など最適な画像のURLに切り替え

🐤 オリジンリクエスト

CloudFrontからオリジンへ転送する際に実行される処理。
CloudFront-Viewer-Countryヘッダの値を使用して、S3バケットのドメイン名をビューワーに近いリージョンのバケットのものに更新したりできる。

🐥 オリジンレスポンス

オリジンからCloudFrontがレスポンスを受信した時に実行される処理。
以下のような処理が可能

  • レスポンスに含まれる画像イメージをリサイズしてオリジンに保存
  • レスポンスステータスコードを変更

🐔 ビューワーレスポンス

CloudFrontがビューワーにレスポンスを返す前に実行される処理。
Cache-Controlなどレスポンスヘッダの値を更新したりできる。

レスポンスヘッダー

CloudFrontでは、ビューワーレスポンスの返却時にHTTPレスポンスヘッダを追加する機能。CORSCache-ControlヘッダなどCloudFrontサイドで簡単に追加することが可能。

まとめ

  • CloudFront は、AWS の CDN(コンテンツ配信ネットワーク)サービス
  • Webサイトや動画、API などのコンテンツを 世界中のエッジサーバーにキャッシュ して高速配信
  • 遅延を減らし、トラフィック集中にも強く、セキュリティ機能も提供

Discussion