話題の記事

AWS再入門 Amazon CloudFront編

2015.12.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

当エントリはDevelopers.IOで弊社AWSチームによる2015年アドベントカレンダー 『AWS サービス別 再入門アドベントカレンダー 2015』の3日目のエントリです。 昨日2日目のエントリは大瀧の『Amazon VPC』でした。

このアドベントカレンダーの企画は、普段AWSサービスについて 最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようという コンセプトが含まれています。 本日3日目のテーマは『Amazon CloudFront』です。

目次

Amazon CloudFrontとは

Amazon CloudFrontはAWSが提供する高速・高パフォーマンスなコンテンツ配信サービス(CDN)です。 世界中にエッジサーバが配備されており、ユーザを最寄りのエッジサーバに誘導することで高速な配信を、またコンテンツをエッジサーバでキャッシュしてオリジンサーバの負荷を減らすことで安定した配信をすることができます。

CloudFrontの仕組み

それではCloudFrontがどのようにコンテンツを配信するか、その仕組みを確認しましょう。 配信するオリジナルのファイルを置いておくサーバを「オリジンサーバ」、ユーザへの配信を行うサーバを「エッジサーバ」と呼びます。 オリジンサーバの指定、またCloudFrontの各設定等は「ディストリビューション」でまとめられます。このディストリビューションには、d111111abcdef8.clodufront.netのようなひとつのCloudFrontドメインが付与されます(111111abcdef8は実際にはランダムな文字列が入ります)。ユーザをこのCloudFrontドメインへアクセスさせることにより、CloudFrontのエッジサーバを経由した配信が行えます。

最寄りのエッジサーバへの誘導

ユーザがCloudFrontのドメインにアクセスすると、CloudFront DNSからユーザに最寄りのエッジサーバのIPアドレスが返されます。エッジサーバは世界各地に配備されていますので、 ユーザはこのIPアドレスにアクセスして、高速なエッジサーバからの配信が受けられます。

キャッシュの仕組み

ユーザからのリクエストを受けたエッジサーバは、要求されたファイルがキャッシュされているか確認します。 キャッシュされていない場合は、オリジンサーバからファイルを取得し、そのファイルをユーザに配信します。また有効期限の間ファイルをキャッシュします。 キャッシュされている場合はオリジンサーバへアクセスはせず、エッジサーバでキャッシュされたファイルを配信します。

CloudFrontの基本的な使い方

それではManagement ConsoleからCloudFrontを設定して、基本的な動作を確認してみたいと思います。

ディストリビューションの作成

Management ConsoleのCloudFrontを開いて、[Create Distribution]ボタンをクリックします。

adcal2015-cf-001

ディストリビューションにはWebとRTMPの種類がありますが、 通常はWebを選択します。S3をオリジンサーバとしてRTMPによるストリーミング動画配信を行う場合のみ、RTMPを選択します。

adcal2015-cf-002

Origin Domain Nameの項目にオリジンサーバのドメイン名を入力します。 今回は静的ウェブサイトホスティングを使ったS3バケットをオリジンサーバとしました。 ドメイン「advent-calendar-2015-cloudfront.s3-website-ap-northeast-1.amazonaws.com」をここに入力します。 他にも、S3バケットやELBについてはドメインを入力せずに選択することもできます。 Origin Domain Nameを入力すると、Origin IDの項目が自動的に入力されます。 adcal2015-cf-003

他にも様々な設定項目がありますがOrigin Domain Nameの設定のみを行い、 ページ一番下の[Create Distribution]ボタンを押してディストリビューションを作成しましょう。ボタンを押すとはじめのディストリビューション一覧画面に戻ります。今作成したディストリビューションはStatusの欄が「In Progress」となっています。ここが「Deployed」に変わればディストリビューションの作成完了です。完了までに15分ほどかかりますので注意しましょう。

adcal2015-cf-005

作成できたら、ID列のリンク文字列をクリックしてディストリビューションの詳細を 見てみましょう。GeneralタブでDomain Nameとなっているところが作成したディストリビューションのドメイン名となります。

adcal2015-cf-006

ブラウザで「http://ディストリビューションのドメイン名/ファイルへパス」へアクセスすると、CloudFrontのエッジサーバを経由してファイルが配信されます。オリジンサーバと同じ内容が表示されるはずです。

キャッシュの制御

エッジサーバを経由してアクセスすると、エッジサーバにはこのファイルがキャッシュされているはずです。確認として、オリジン側のファイルを更新してみましょう。再度CloudFrontのドメインでアクセスしてみても、ファイルは更新されていません。CloudFrontはデフォルトで24時間ファイルをキャッシュします。

キャッシュ時間をそれより短い24時間以下とするためには、オリジンサーバのファイルにHTTPヘッダ情報を付与する必要があります。 ここではS3へファイルをアップロードする際に、HTTPヘッダ情報を付与してみましょう。 S3のManagement Consoleでファイルをアップロードする際に、すぐに[アップロードの開始]を押さずに、[詳細の設定>]、[アクセス許可の設定>]、[メタデータの設定>]とボタンを押して画面を先に進めます。

メタデータの設定画面で、キーは「Cache-Contrl」を選択します。値には、今回はキャッシュする時間を10分(=600秒)としたいので、「max-age=600」を指定します。そして[アップロードの開始]を押してファイルをアップロードします。

adcal2015-cf-009-2

ファイルをアップロードしたあと、先ほどと同様にCloudFrontのドメイン名+ファイルパスでアクセスしてみます。初回のアクセスキャッシュで、有効期限600秒でエッジサーバにキャッシュされます。 ファイルを更新して再度アクセスした際、初回アクセスから600秒以内であれば、ファイルは更新されないはずです。600秒以上経過していれば、エッジサーバは再度オリジンサーバからファイルを取得するので、更新したファイルが参照できます。

キャッシュの無効化

それでは、はじめにアップロードした、ヘッダ情報を付与していないファイルをキャッシュ有効期限中の24時間以内に削除したい、他のファイルに更新したい、といった場合はどうしたらよいでしょうか。 CloudFrontにはインバリデーションと呼ばれるキャッシュを無効化する機能があるので、これを使用します。

CloudFrontのドメイン名を確認した時と同じ手順で、Management Consoleのディストリビューションの一覧からIDのリンクをクリックしてディストリビューションの詳細ページへ進みます。ここで並んでいるタブの一番右に「Invalidations」の項目があるのでこれを選択します。

adcal2015-cf-008

Create Invalidationsのボタンがるのでこれをクリックすると「Create Invalidation」のダイアログが出現しますので、Object Pathsの部分に無効化したファイルのパス+ファイル名を入力します。入力方法はExamples:を真似しましょう。ワイルドカードを使用することで一括して指定することも可能です。Invalidateボタンを押すと処理がはじまります。

adcal2015-cf-009

インバリデーションの完了には、15分ほど時間がかかります。 その間、そのインバリデーション処理はStatusが「InProgess」となっています。 Status欄がCompleteになればインバリデーション完了です。 キャッシュが無効化されるため、エッジサーバにアクセスがあると、エッジサーバはオリジンサーバからファイルを取得して配信します。

adcal2015-cf-010

エラーページのキャッシュ時間

例えばオリジンサーバにファイルをアップロードする前に、CloudFrontのキャッシュサーバからアクセスした場合はどうなるでしょうか。 CloudFrontのエッジサーバはオリジンサーバにファイルを取得しようとしますが、オリジンサーバからは「404: NotFound」などのエラーレスポンスが返ってくるはずです。CloudFrontでは、エッジサーバでこれらエラーレスポンスをデフォルトで300秒(5分)キャッシュします。そのため、デフォルト状態ではオリジンサーバにファイルをアップロードする前にキャッシュサーバからアクセスしてしまった、などの場合は5分間はファイルにアクセスできない状態が続くことになります。

このエラーレスポンスのキャッシュも変更することが可能です。 ディストリビューション設定画面のError Pagesタブから[Create Custom Error Response]ボタンを押します。

adcal-cf-011

HTTP Error Codeで変更したいエラーコードを選択します。またError Caching Minimum TTL でキャッシュ時間を秒で指定します。今回は404: NotFoundのキャッシュ時間を30秒としました。これで[Create]をクリックします。

adcal2015-cf-012

このエラーレスポンスの設定も、反映完了までには15分ほどかかります。ディストリビューション一覧画面でStatusが「In Progress」から「Deployed」になるまで待ちましょう。

その他の基本的な機能

独自ドメイン指定

CloudFrontではユーザアクセスにd111111abcdef8.cloudfront.netのドメインを使用する他、独自ドメインで運用することもできます。 一度設定したディストリビューションではディストリビューションの設定画面からAlternate Domain Names(CNAMEs)を変更します。またディストリビューションを作成するときに同じ項目でも設定することが可能です。

adcal2015-cf-013

ログの設定

CloudFrontではアクセスログを取得することも可能です。 ログはS3に保存されます。リアルタイムではなく、1時間ほど集計に時間がかかることに注意してください。 こちらもディストリビューションの設定画面から、LogginをOnにして保存するバケット並びにLogPrefixを指定します。ディストリビューションを作成するときにも設定することができます。

adcal2015-cf014

ユースケース

サイトの高速化

サイトの表示が遅い、大容量ファイルのダウンロードが遅い、といった場合に、ファイルをCloudFront経由で配布することで配信を高速化することができます。 海外からのユーザが多い場合などでサイトの表示速度が気にになる場合などにも効果を発揮しますが、日本国内のみの配信という場合でも高速化の効果を得られます。

負荷対策

テレビやポータルサイトへの露出、イベント事などで通常のサイトでも一時的にアクセス過多によりサーバの負荷が上がることがあります。大容量ファイルを扱う場合でなくても、ユーザアクセスが膨大で多くのレスポンスを必要とする場合などに、CloudFrontをキャッシュとして利用することでオリジンサーバの負荷を下げ、安定した配信が行えます。

動画配信

CloudFrontとAdobe Media ServerやWowzaなどのStreaming Serverを組み合わせることで、安定した動画配信環境が構築できます。動画配信はサーバへのネットワーク負荷が高くなりますが、CloudFrontを活用することで安定した配信が行えます。

またS3をオリジンとしたRTMP、Smooth Streaming形式でのVODストリーミング配信にも対応しています。別途Streaming Serverを構築することなくS3+CloudFrontのみでストリーミング配信が行えます。

高度な機能

Amazon CloudFront基本的な機能を紹介いたしましたが、 これ以外にも様々な機能があり、また頻繁に機能追加、アップデートされています。ここではいくつかの機能を簡単に紹介したいと思います。

キャッシュ期間のより柔軟な制御

ディストリビューション設定はデフォルトのまま、オリジンサーバにあるファイルのHTTPヘッダ情報によりキャッシュの制御を行う方法をご紹介しましたが、これ以上により柔軟な制御が行えます。

アクセス分析機能

CloudFrontではログを出力する他、レポート機能やCloudWatchでの監視をすることができます。

ジオターゲティング機能

ユーザがどの国・地域からアクセスしてきているかをCloudFrontで検出することができます。

あわせて読みたい公式情報

さいごに

以上、『AWS サービス別 再入門アドベントカレンダー 2015』の3日目のエントリ『Amazon CloudFront編』でした。 CloudFrontは初期費用なしで使用できる従量課金制のCDNなので、気軽に試してみてサイトの高速化、安定配信を目指せると思います。明日(12/4)はしんやのAmazon Redshiftです。お楽しみに!