ITの教科書検索
入門読了 約12分

Amazon CloudFrontとは ― CDNの仕組みとS3連携

CloudFrontは、世界各地の拠点にキャッシュを置いてコンテンツを速く届けるAWSのCDNです。ディストリビューションとオリジンの関係、S3と組み合わせる方法を説明します。

目次
  1. CloudFrontとは
  2. ディストリビューションとオリジン
  3. エッジロケーションとリージョン・AZの関係
  4. 要求の届き方:キャッシュのヒットとミス
  5. 動かして確かめる:クエリ文字列とキャッシュキー
  6. S3オリジンとオリジンアクセスコントロール
  7. 練習問題

CloudFrontとは、AWSのCDNサービス

遠くにいる利用者にも、Webサイトの画像やAPIの応答を速く返したい。そのときに使うAWSのCDN(Content Delivery Network)が、Amazon CloudFrontです。CDNは、コンテンツの複製を各地に置いて配信を速くする仕組みです。CloudFrontは世界各地の拠点にキャッシュを置き、利用者に近い場所からコンテンツを届けます。

CDNの一般的な仕組みは、CDNの記事で説明しています。

ディストリビューションとは、配信設定をまとめたもの

ディストリビューションとは、CloudFrontで配信するための設定をまとめた単位です。どのオリジンから取得するかを、ここで指定します。

ディストリビューションを作ると、CloudFrontが配信用のドメイン名を発行します。d111111abcdef8.cloudfront.net のような名前です。自分のドメイン名を使う設定もできます。

ディストリビューションの設定は、すべてのエッジロケーションへ配布されます。配布されるのは設定だけで、コンテンツそのものは含まれません。コンテンツは、最初の要求が来たときにオリジンから取得します。

オリジンとは、コンテンツの元になる場所です。代表的なオリジンは2種類です。1つはS3バケットです。もう1つは、EC2インスタンスや自分で管理するHTTPサーバで、カスタムオリジンと呼びます。

エッジロケーションは、リージョン・AZとは別の拠点

エッジロケーションとは、CloudFrontがキャッシュを置く拠点です。リージョン・AZの記事で説明したリージョンやAZとは別に、より多くの地点に置かれています。

東京リージョンAZ-aオリジン(Webサーバ)AZ-c少数の拠点エッジロケーション(750以上、世界各地)東京ロンドンシンガポールシアトル大阪東京リージョンAZ-aオリジン(Webサーバ)AZ-c少数の拠点エッジロケーション(750以上、世界各地)東京ロンドンシンガポールシアトル大阪
オリジンは東京リージョンのAZ-aなど、少数の拠点に置きます。エッジロケーションはリージョン・AZとは別の拠点で、AWSは世界50以上の国、100以上の都市に750以上を持ちます。

AWSの公式ページによると、エッジロケーション(POP)は750以上あります。100以上の都市、50以上の国に広がっています。オリジンは少数のリージョンに置き、利用者の近くのエッジロケーションがキャッシュを持ちます。このエッジは配信の拠点です。端末のデータを近くで処理するエッジコンピューティングとは別の考え方です。

要求はどう届くか:キャッシュのヒットとミス

利用者の要求は、DNSによって最も適したエッジロケーションへ導かれます。通常は、レイテンシー(通信の遅延)が最も小さいエッジロケーションです。エッジロケーションは、まず自分のキャッシュを確認します。

キャッシュにあれば、そのまま利用者に返します。これがキャッシュヒットです。キャッシュに無ければ、要求をディストリビューションの設定と照合し、該当するオリジンへ転送します。これがキャッシュミスです。

キャッシュヒットのとき利用者エッジロケーション(キャッシュあり)オリジン①要求②キャッシュから即返す通信しないキャッシュミスのとき利用者エッジロケーション(キャッシュなし)オリジンS3バケットEC2などカスタムオリジン①要求②ディストリビューションの設定と比較し転送③オブジェクトを返す④保存しつつ転送キャッシュヒットのとき利用者エッジロケーション(キャッシュあり)オリジン①要求②キャッシュから即返す通信しないキャッシュミスのとき利用者エッジロケーション(キャッシュなし)オリジンS3バケットEC2などカスタムオリジン①要求④保存しつつ転送②ディストリビューションの設定と比較し転送③オブジェクトを返す
キャッシュヒットのときは、エッジロケーションがオリジンと通信せずに応答します。キャッシュミスのときは、ディストリビューションの設定と比較してS3バケットやEC2などのオリジンへ転送し、受け取ったオブジェクトを保存しながら利用者に返します。

オリジンから最初の1バイトが届くと、CloudFrontは利用者への転送を始めます。同時に、受け取ったオブジェクトをキャッシュにも保存します。次に同じ要求が来ると、このキャッシュがヒットします。

実際には、エッジロケーションとオリジンの間に、リージョナルエッジキャッシュという大きめのキャッシュがあります。エッジロケーションでキャッシュミスになると、通常はまずリージョナルエッジキャッシュを確認します。そこにも無いときに、オリジンへ転送します。

キャッシュの保存期間は、2つの設定で決まります。オリジンが付けるCache-Controlなどのヘッダと、CloudFront側のTTL(有効期間)です。指定の仕方とTTLの意味は、CDNの記事のキャッシュの有効期限を参照してください。

公式ドキュメントによると、既定では各オブジェクトが24時間キャッシュに残ります。ただし、要求の少ないオブジェクトは、期限の前に削除されることがあります。

データベースから読んだデータを、アプリのそばのメモリにキャッシュするサービスはAmazon ElastiCacheです。

動かして確かめる:クエリ文字列を含めるとキャッシュキーが変わる

クエリ文字列は、URLの「?」より後ろの部分です。CloudFrontでは、どのクエリ文字列をキャッシュの判断に使うかを設定で選べます。キャッシュの判断に使う値の組み合わせを、キャッシュキーと呼びます。同じパスでも、この設定によって、クエリ文字列が違う要求がヒットにもミスにもなります。

クエリ文字列をオリジンに転送せず、キャッシュキーにも使わない設定

  1. /photo.jpg?color=red&size=large
    キャッシュキー:/photo.jpg
    ミス
    1回目の要求です。キャッシュキーにクエリ文字列は入りません。新しく保存します。
  2. /photo.jpg?color=blue&size=small
    キャッシュキー:/photo.jpg
    ヒット
    色・サイズが違っても、キャッシュキーは同じです。そのため、最初に保存した画像がそのまま返ります。

オリジンにもクエリ文字列が届かないので、色やサイズごとに違う画像は返せません。クエリ文字列で中身が変わらないファイルに向きます。

クエリ文字列を転送しない設定では、キャッシュキーにクエリ文字列が入らず、値の違いは無視されます。すべて転送する設定では、パラメータの順序や大文字小文字が違うだけでも、別のキャッシュとして扱われます。オリジンの応答が実際に変わるパラメータだけを選べば、無駄なキャッシュを増やさずに済みます。

S3オリジンとオリジンアクセスコントロール(OAC)

S3バケットをオリジンにするときは、CloudFront経由のアクセスだけを許可したいことがあります。バケットへの直接アクセスを防ぐためです。そのための仕組みが、オリジンアクセスコントロールです。OACを使うと、CloudFrontがS3への要求に署名します。

S3バケットポリシーOACを使うディストリビューションだけに読み取りを許可する例
{
  "Effect": "Allow",
  "Principal": { "Service": "cloudfront.amazonaws.com" },
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::example-bucket/*",
  "Condition": {
    "StringEquals": {
      "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"
    }
  }
}
# Condition で、指定したディストリビューションからの要求だけに限ります。

以前は、Origin Access Identity(OAI)という仕組みが使われていました。OAIは、SSE-KMSで暗号化したオブジェクトや、PUT・POSTなどの要求に対応していません。AWS公式ドキュメントは、OACの利用を勧めています。

自分のドメインでCloudFrontを使うときは、Route 53のエイリアスレコードを使えます。エイリアスレコードは、CNAMEレコードと違って、ドメインそのもの(ゾーンの頂点)にも設定できます。ディストリビューションにWAFを付けて要求の中身を検査する方法は、WAFとShieldの記事で説明しています。

参考にした資料

練習問題(全4問)

Q1CloudFrontのディストリビューションの説明として正しいものはどれ?
Q2エッジロケーションにキャッシュが無いとき(キャッシュミス)のCloudFrontの動きとして正しいものはどれ?
Q3S3オリジンで使うオリジンアクセスコントロール(OAC)の説明として正しいものはどれ?
Q4クエリ文字列をすべてキャッシュキーに含める設定のとき、/photo.jpg?color=red&size=large と /photo.jpg?size=large&color=red への要求はどう扱われる?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

関連記事

AWSの記事を続けて読む

AWS 全38本中19本目