Amazon CloudFrontとは ― CDNの仕組みとS3連携
CloudFrontは、
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とは別に、より多くの地点に置かれています。
AWSの公式ページによると、エッジロケーション(POP)は750以上あります。100以上の都市、50以上の国に広がっています。オリジンは少数のリージョンに置き、利用者の近くのエッジロケーションがキャッシュを持ちます。このエッジは配信の拠点です。端末のデータを近くで処理するエッジコンピューティングとは別の考え方です。
要求はどう届くか:キャッシュのヒットとミス
利用者の要求は、DNSによって最も適したエッジロケーションへ導かれます。通常は、レイテンシー(通信の遅延)が最も小さいエッジロケーションです。エッジロケーションは、まず自分のキャッシュを確認します。
キャッシュにあれば、そのまま利用者に返します。これがキャッシュヒットです。キャッシュに無ければ、要求をディストリビューションの設定と照合し、該当するオリジンへ転送します。これがキャッシュミスです。
オリジンから最初の1バイトが届くと、CloudFrontは利用者への転送を始めます。同時に、受け取ったオブジェクトをキャッシュにも保存します。次に同じ要求が来ると、このキャッシュがヒットします。
実際には、エッジロケーションとオリジンの間に、リージョナルエッジキャッシュという大きめのキャッシュがあります。エッジロケーションでキャッシュミスになると、通常はまずリージョナルエッジキャッシュを確認します。そこにも無いときに、オリジンへ転送します。
キャッシュの保存期間は、2つの設定で決まります。オリジンが付けるCache-Controlなどのヘッダと、CloudFront側のTTL(有効期間)です。指定の仕方とTTLの意味は、CDNの記事のキャッシュの有効期限を参照してください。
公式ドキュメントによると、既定では各オブジェクトが24時間キャッシュに残ります。ただし、要求の少ないオブジェクトは、期限の前に削除されることがあります。
データベースから読んだデータを、アプリのそばのメモリにキャッシュするサービスはAmazon ElastiCacheです。
動かして確かめる:クエリ文字列を含めるとキャッシュキーが変わる
クエリ文字列は、URLの「?」より後ろの部分です。CloudFrontでは、どのクエリ文字列をキャッシュの判断に使うかを設定で選べます。キャッシュの判断に使う値の組み合わせを、キャッシュキーと呼びます。同じパスでも、この設定によって、クエリ文字列が違う要求がヒットにもミスにもなります。
クエリ文字列をオリジンに転送せず、キャッシュキーにも使わない設定
- /photo.jpg?color=red&size=largeキャッシュキー:/photo.jpgミス1回目の要求です。キャッシュキーにクエリ文字列は入りません。新しく保存します。
- /photo.jpg?color=blue&size=smallキャッシュキー:/photo.jpgヒット色・サイズが違っても、キャッシュキーは同じです。そのため、最初に保存した画像がそのまま返ります。
オリジンにもクエリ文字列が届かないので、色やサイズごとに違う画像は返せません。クエリ文字列で中身が変わらないファイルに向きます。
クエリ文字列をすべてキャッシュキーに含める設定
- /photo.jpg?color=red&size=largeキャッシュキー:/photo.jpg?color=red&size=largeミス1回目の要求です。このクエリ文字列を含むキャッシュキーで、新しく保存します。
- /photo.jpg?size=large&color=redキャッシュキー:/photo.jpg?size=large&color=redミス値は同じでも、パラメータの順序が違います。そのため別のキャッシュキーになり、ミスします。
- /photo.jpg?color=red&size=largeキャッシュキー:/photo.jpg?color=red&size=largeヒット1回目と同じ順序・同じ値の要求なので、保存した画像がヒットします。
パラメータの順序や大文字小文字が違うだけでも、別のキャッシュとして扱われます。公式ドキュメントは、パラメータを常に同じ順序(例:アルファベット順)で並べることを勧めています。
colorパラメータだけをキャッシュキーに含め、sizeは無視する設定
- /photo.jpg?color=red&size=largeキャッシュキー:/photo.jpg?color=redミス1回目の要求です。キャッシュキーにはcolor=redだけが入ります。新しく保存します。
- /photo.jpg?color=red&size=smallキャッシュキー:/photo.jpg?color=redヒットsizeの値は無視されるので、同じcolor=redのキャッシュがヒットします。
- /photo.jpg?color=blue&size=largeキャッシュキー:/photo.jpg?color=blueミスcolorの値が違うので、別のキャッシュキーになります。新しく保存します。
オリジンが実際に違う画像を返すパラメータ(この例ではcolor)だけをキャッシュキーに使うと、キャッシュに保存する数を減らせます。
クエリ文字列を転送しない設定では、キャッシュキーにクエリ文字列が入らず、値の違いは無視されます。すべて転送する設定では、パラメータの順序や大文字小文字が違うだけでも、別のキャッシュとして扱われます。オリジンの応答が実際に変わるパラメータだけを選べば、無駄なキャッシュを増やさずに済みます。
S3オリジンとオリジンアクセスコントロール(OAC)
S3バケットをオリジンにするときは、CloudFront経由のアクセスだけを許可したいことがあります。バケットへの直接アクセスを防ぐためです。そのための仕組みが、オリジンアクセスコントロールです。OACを使うと、CloudFrontがS3への要求に署名します。
{
"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の記事で説明しています。
参考にした資料
- AWS「What is Amazon CloudFront?」(定義、ディストリビューション・オリジン、既定のキャッシュ期間)
- AWS「How CloudFront delivers content」(ヒット・ミスの処理の流れ)
- AWS「Manage how long content stays in the cache (expiration)」
- AWS「Cache content based on query string parameters」
- AWS「Restrict access to an Amazon S3 origin」(OAC・OAIの違い、バケットポリシー)
- AWS「Amazon CloudFront の機能」(エッジロケーション750以上)
練習問題(全4問)
正解:どの
AWS公式ドキュメントの
正解:ディストリビューションの
AWS公式ドキュメントに
正解:CloudFrontが
OACを
正解:パラメータの
AWS公式ドキュメントの
選んでから「採点する」を押すと、解説つきで答え合わせができます。