AWSのCDNサービスCloudFrontを始める (実習オリジンサーバー：S3)

##**概要**
最近、色んなプロジェクトで面白い仕組みのback-end、front-endを触れるようになりました。
面白かった仕組みの中で一つがCDNでした。
また、AWSのCloudFrontサービスでCDN仕組みを簡単に構築できました。
ということで、自分のリマインダーと初心者の方に伝えるために記事を書いておきます。

##**CDN**とは
**`CDN`**(Contents Delivery Network)とはウェブコンテンツを配信することに最新化されたネットワークという意味です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/e9931e77-f00c-1ac9-296e-1db621e7bd34.png)
基本的には、ウェブサイトにある画像や動画などの静的なコンテンツをウェブサーバとは別のサーバにキャッシュして静的データを提供する仕組です。例えば、Googleのサーバはドコにあるのでしょうか。具体的な場所は公開されていませんが、Google目く「世界中にある」そうです。そのユーザーの一番近いエッシサーバからデータを提供する仕組になっています。その仕組を**CDN**といいます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/4be52474-2fdd-172d-cb4e-5ef843894025.png)

##**CloudFront**とは
そうすると、AWSの**`CloudFront`**サービスは何でしょう。
以下の通り🔗[ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Introduction.html)によく説明されています。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/3095dc77-db92-a8c6-a2e3-0115fd61daf2.png)

```
CloudFront は、静的および動的なウェブコンテンツ（.html、.css、.php、イメージファイルなど）をエンドユーザーに高速に配信するウェブサービスです。CloudFront は、エッジロケーションというデータセンターの世界的ネットワークを経由してコンテンツを配信します。CloudFront を使用して提供されているコンテンツをユーザーがリクエストすると、そのユーザーはエッジロケーションにルーティングされます。エッジロケーションでは最も低いレイテンシー（遅延時間）が提供されるので、コンテンツは可能な最高のパフォーマンスで配信されます。コンテンツがエッジロケーション内に最も低いレイテンシーですでに存在している場合、CloudFront はそのコンテンツを即時に配信します。コンテンツがこのエッジロケーションに現在存在しない場合、CloudFront は、コンテンツの最終バージョンのソースとして識別されている Amazon S3 バケットまたは HTTP サーバー（ウェブサーバーなど）からコンテンツを取り込みます。
```

CDNは**`オリジンサーバー`**が重要です。
**オリジンサーバー**はそれぞれのクライアントに**静的データを配布するサービス**です。
オリジンサーバーは**S3**や**EC2**を主に利用しています。

##**実習**
さて、一番基本的なS3をオリジンサーバーとして利用するCloudFront配布を生成して見ましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/2e3ff58d-fa5b-07f6-cdfd-352a383feef6.png)
#####**① S3にBucketを生成して配布するhtmlファイルをアップロードします。**
すみませんが、こちらの詳しい説明は他の記事をご覧ください。

```html:sample.html
<html>
<head>
    <title>Example CloudFront Distribution</title>
</head>
<body>
	<br><br><br>
    <MARQUEE behavior="alternate" scrollDelay="50">Hello CloudFront - S3</MARQUEE>
    <br><br><br>
</body>
</html>
```
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/c4aa20c8-dcdd-6606-7737-c48a93dbb714.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108364/21f455ea-d6c2-6316-6994-cfb7c1d4fb86.png)

#####**② CloudFrontサービス開始**
AmazonのコンソールCloudFrontに移動して、新しい配布を作ります。

#####**③コンテンツ配布方法選択**
コンテンツを配布する方法を選択します。
今回は静的なコンテンツ、**WEB**を選択します。
動画のリアルタイミングプロトコル、**RTM**Pも適用しています。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/cc006dee-4442-3b99-f747-2ee1470c3c43.png)

#####**④生成する配布の設定**
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/cd7ccf05-5763-9d67-e203-0af5858a2568.png)

・Origin Domain Name
オリジンのドメイン名を設定します。
入力エリアをクリックすると、現在利用できるS3バケットとELBのリストが表示されます。
上で生成したS3バケットを選択します。

・Origin ID
オリジン区分するIDです。
特に気にする部分ではありませんし、Origin Domain NameでS3バケットを選択すると自動に設定されます。

・Restrict Buket Access
S3バケットにCloudFrontしかアクセス出来ないように設定する項目です。
Yesを選択してください。

・Origin Access Identity
オリジンにアクセスする識別子でございます。
新たに生成することもできますし、もうあるものも利用できます。
今回はCreate a New Identityを選択しましょう。

・Comment
新たに生成する識別子です。
デフォールトそのまま使いましょう。

・Grant Read Permissions on Bucket
CloudFrontがS3でファイルを読める権限をバケットのBucket Policyに設定します。
Yesに設定すると、他のアクセスは制限され、CloudFrontしかアクセス出来るようにバケットにBucket Policyが設定されます。
Yes, Update Bucket Policyを選択しましょう。

・Path Pattern
CloudFrontでファイルを取り込む規則です。
デフォルトは「*」に設定されているので、全てのファイルを取り込むことになります。
この部分は生成した後、追加するのができます。

・Viewer Protocol Policy
CloudFrontのプロトコル政策です。
デフォルトのそのまま利用しましょう。
 - HTTP and HTTPS : HTTPとHTTPS全部利用します。
 - Redirect HTTP to HTTPS : 全てのHTTPアクセスをHTTPSにリダイレクトします。
 - HTTPS Only : HTTPSのみ利用します。

・Allowed HTTP Methods
許可するHTTPメソッドの種類です。
デフォルトのそのまま利用します。
 - GET, HEAD : ファイルを読むときだけ選択します。
 - GET, HEAD, PUT, POST, PATCH, DELETE, OPTIONS : 動的なコンテンツを送信するとき選択します。

続いてこ細かい設定でございます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/262e0d6d-5f45-dab0-16bc-c17079692385.png)
・Object Caching
ファイルのキャッシュの維持時間を設定します。
維持時間が過ぎたらCloudFrontにあるファイルが削除されます。
デフォルトそのまま利用します。
 - Use Origin Cache Headers : オリジンHTTPヘッダーのキャッシュ設定を従います。それぞれのファイルあたりに設定するのが出来るメリットがあります。キャッシュ設定が無かったらデフォルトキャッシュ維持時間は24時間です。
 - Customize : デフォルトキャッシュ維持時間を設定します。
 - Minimum TTL : 最初のキャッシュの維持時間です。秒単位で設定して、このMinimum TTL設定時間とオリジンHTTPヘッダーのキャッシュ設定(Cache-Control)時間中、長い時間が適用されます。

・Forward Cookies
オリジンのクッキーをCloudFrontを経てクライアントに伝えるかを設定します。
デフォルトそのまま利用しましょう。
 - None : クッキーを伝えません。キャッシュの性能がもっと向上されます。
 - Whitelist : クッキーを選別して伝えます。
 - Whitelist Cookies : 伝えるクッキーの名前を設定します。それぞれのクッキーは行別に区分されます。

・Query String Forwarding and Caching
CloudFrontにオリジンでクエリー文字列を伝えます。
オリジンでクエリー文字列を区分して見せるためには設定します。
設定しないとキャッシュの性能が向上されます。
デフォルトそのまま利用しましょう。

・Smooth Streaming
リアルタイムストリーミングプロトコル、Microsoft Smooth Streamingを利用する時設定します。
デフォルトそのまま利用しましょう。

・Restrict Viewer Access
Signed URLでCloudFrontの利用を制限したい場合設定します。
デフォルトそのまま利用しましょう。

・Price Class
料金のレベルです。
エッジロケーション利用範囲を設定するとき、実際サービスにはそんなに必要じゃない地域を除外する場合設定します。
デフォルトそのまま利用しましょう。

・Alternate Domain Names
Route 53でドメインを連携する場合、こちらを設定するべきです。
色んなドメインでしたら、行別に区分して最大10個まで設定するのができます。
今回は使いません。

続いてこ細かい設定でございます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/997f7f97-7699-7cc2-c960-713dafe4ac0f.png)

・SSL Certificate
HTTPSプロトコルを利用するための認証書の設定です。
デフォルトそのまま利用しましょう。
 − Default CloudFront Certificate : CloudFrontの認証書を利用します。
 − Custom SSL Certificate : 利用者が購入したドメインと認証書を利用する場合設定します。認証書の保存はIAMで可能です。
 − Custom SSL Client Support ：カスタムSSLクライアント設定です。先にCustom SSL Certificateを設定するべきです。
 − All Clients : 専用IP利用者指定SSL設定です。詳しい内容は🔗[ドキュメント](https://aws.amazon.com/jp/cloudfront/custom-ssl-domains/?nc1=h_ls)を参考してください。

```
Amazon CloudFront には、ウェブサイト全体を高速化しつつ、CloudFront のどのエッジロケーションからでも HTTPS 経由でコンテンツを安全に配信する 3 つのオプションがあります。エッジロケーションからの安全な配信に加えて、オリジンフェッチ用に HTTPS 接続を使用するよう、CloudFront を設定することもできます。これにより、お客様のオリジンサーバーとエンドユーザーのエンドツーエンド間でデータが暗号化されます。
```

・Supported HTTP Versions
サポートするHTTPバージョンを設定します。
デフォルトそのまま利用しましょう。

・Default Root Object
CloudFront配布のドメインの最上位にアクセスしたとき見せるファイルの名前です。
今回はsample.htmlにしました。

・Logging
CloudFrontアクセスログ設定です。
デフォルトそのまま利用しましょう。

 − Bucket for Logs : CloudFrontログを保存するS3バケットを設定します。

 − Log Prefix : S3バケットにログを保存する場合、ディレクトリー名を設定します。

・Enable IPv6
IPv6からのアクセスも反映するかを設定します。
今回はチェックしなかったです。

・Comment
メモです。追加で説明とか記録する場合、利用します。

・Distribution State
配布を生成した後、配布状態を設定します。
 − Enabled : すぐ利用出来る状態になります。
 − Disabled : 配布生成のみ非活性化します。

![image](https://qiita-image-store.s3.amazonaws.com/0/108364/12dc06d6-89aa-99d4-a6fd-dc5c89a0b75c.png)
成功的にCloudFront配布が生成しました。
気になる部分及びもっと詳しい設定内容は🔗[ドキュメント](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html)を参考してください。

`Status`を見ると`InProgress`に表示されインジケーターがぐるぐるしています。
配布が全てのエッジロケーションに電波されるまでは約**15~20**分かかるためです。

#####**⑤結果確認**
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/6b13b593-6a57-5750-df28-751a5ad1c62b.png)

全てのエッジロケーション電波が完了されたら、`Status`が`Deployed`に変わります。
また、`Domain Name`にCloudFront配布のドメインが表示されます。

では、ウェブでCloudFrontに接続してみましょう。
`sample.html`内容がちゃんと出ています。
CloudFront配布ドメイン形は`d39embebg71el9.cloudfront.net`で、前の`d39embebg71el9`は生成した配布を区分しています。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/086d6b61-3431-8aeb-b475-2362b333078c.png)

**これで、Webサーバの地域に関わらず全世界どこでも早くデータを配布するのができます。👏👏👏**

  

#####**⑥ChromeからHTTPヘッダーを確認**
Web Browser、Chromeの開発ツールにはHTTPヘッダーを確認するのができます。
NetworkタブのResponse HeadersのX-Cache項目を見ると`Hit from cloudfront`だと表示されます。
これは、CloudFrontにキャッシュされたファイルを取り込んだという意味です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/f5806e20-5357-a8ba-b418-226ba9e85061.png)
キャッシュの維持時間が過ぎてCloudFrontがオリジンにアクセスしてファイルを取り込んだときは、
`Miss from cloudfront`だと表示されます。

#####**⑦CloudFront配布削除する**
CloudFront配布を削除するためには、配布リストから配布を選択して`Disable`設定をします。
非活性状態になったらまた全てのエッジに電波されるまで約15~20分かかります。
その後、`Status`が`Deployed`になったら削除可能になります。