キャッシュサーバーを配置する

# 内容
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
前回の記事「HTTPS通信でアクセス可能にする」の続きです。
##### 前回の記事
https://qiita.com/zakinicof/items/118c0e6dee648a7faa93
前回までの構成では、独自ドメインを取得し、HTTPS通信でアクセスするとブログサイトを閲覧できる状態でした。
今回はクライアントとELBの間にCloudFrontを設置して、同じようにブログサイトにアクセス出来るよう設定していきます。
CloudFrontとは、データを効率良く配信できるキャッシュサーバーをフルマネージドで利用できるAWSのサービスです。
EC2のデータをCloudFrontにコピーしているようなイメージです。
ユーザーはEC2にデータを取りに行くのではなく、間にあるCloudFrontに取りにいきます。
これによって、ユーザーにとってはWebページの表示が速くなり、サーバーにとっては、データを渡す処理が減るため、負荷が軽減されるメリットがあります。
![スクリーンショット 2021-06-24 10.30.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790886/dc67eec9-b23c-eb00-46b0-d3571f560ca6.png)


# 実施手順

##### 前回の記事の構成がされていることを前提で進めていきます。

## 準備

1. EC2インスタンスが2台立ち上がっていることを確認
1. RDSを削除した場合は、スナップショットから復元しておく。
1. 復元したデータベースのステータスが`利用可能`になるまで待つ。
1. ブログはHTTPS通信で閲覧できることを確認しておく。

## Route53の設定

##### ロードバランサーとドメイン名の紐づけを一時的に変更します。

1. Route53の画面を開き、`ホストゾーン`を選択
1. 前回作成したホストゾーンを選択
1. ルーティングポリシーが`フェイルオーバー`のレコードが2つあるので片方を選択し、`レコードの編集`を選択
1. `レコード名`を一旦`alb`に変更する。
1. `保存`を選択
1. もう一方のレコードも同様に編集する。

## ロードバランサーの設定

##### ロードバランサーにアタッチされている証明書をどのサブドメインでも使用可能にするように設定します。

1. EC2の画面に移動し、左メニューから`ロードバランサー`を選択
1. `リスナー`タブを開き、HTTPS:443のリスナーを一旦削除する。
1. `リスナーの追加`を選択
1. プロトコル：`HTTPS`を選択
1. `アクションの追加`→`転送先`と進み、ターゲットグループを選択し、チェックボタンを選択
1. `新しいACM証明書をリクエスト`を選択
1. ドメイン名：`*.[取得したドメイン名]`を入力し、次へ進む。
1. 検証方法の選択：`DNS の検証`を選択して次へ
1. `確認とリクエスト`を選択
1. ドメイン名の`▶︎`ボタンを選択し、`Route53でのレコードの作成`を選択
1. `作成`を選択
1. 右下の`続行`を選択
1. Route53の画面に移り、更新ボタンを選択、証明書用のレコードが2つあることを確認する。
1. 2つのうち古いレコードは不要なので削除しておく。
1. AWS Certificate Managerの画面に戻り、更新ボタンを選択
1. 古い証明書は不要なので削除する。
1. リスナーの画面に戻り、`デフォルトのSSL証明書`の項目で更新ボタンを選択し、先ほど作成した証明書を選択
1. 右上の`リスナーの追加`を選択
1. ブラウザでブログのURLを`https://alb[ドメイン名]`に変更してブログが閲覧できることを確認する。

## CloudFront用の証明書を作成

##### CloudFront用の証明書は米国東部バージニア北部のリージョンでしか取得できないので注意しましょう。

1. AWS Certificate Managerの画面で`東京`に設定されているリージョンを`バージニア北部`に変更する。
1. `証明書のプロビジョニング`の項目で`今すぐ始める`を選択
1. `証明書のリクエスト`を選択
1. ドメイン名：`*.[ドメイン名]`を入力し、次へ進む。
1. 検証方法の選択：`DNS の検証`を選択して次へ
1. `確認とリクエスト`を選択
1. ドメイン名の`▶︎`ボタンを選択し、`Route53でのレコードの作成`を選択
1. `作成`を選択
1. 右下の`続行`を選択
1. 証明書の`状況`が`発行済み`となっていることを確認する。

## CloudFrontの設定

##### CloudFrontは現時点では日本語対応していないですが、気にせず進めます。

1. 検索窓で`CloudFront`を検索し、CloudFrontの画面に移る。
1. `Create Distribution`を選択
1. `Web`の項目の`Get Started`を選択
1. Origin Domain Name：`alb.[ドメイン名]`を入力
1. Origin Protocol Policy：`HTTPS Only`を選択
1. Viewer Protocol Policy：`HTTPS Only`を選択
1. `Cache Policy`の項目の`Create a new policy`を選択
1. ページが切り替わるので、`Name`に任意の値を入力
1. `Minimum TTL`、`Maximum TTL`、`Default TTL`をそれぞれ`60`に設定しておく。
1. 他の項目はデフォルトのままで右下の`Create cache policy`を選択
1. `Cache Policy`の更新ボタンを押し、先ほど設定したCache Policyを選択
1. SSL Certificate：`Custom SSL Certificate (example.com):`を選択し、下の入力欄で先ほど作成した証明書を選択
1. Alternate Domain Names(CNAMEs)：`alb.[ドメイン名]`に変更する前に設定していたドメイン名を入力
1. 上記の設定で`Create Distribution`を選択
1. Statusが`In Progre`から`Deployed`になるまで数分待つ。
1. 作成したディストリビュージョンのIDを選択し、`Domain Name`をコピー
1. コピーしたものをブラウザのURL欄に貼り付けてブログが表示されることを確認する。

##### CloudFrontへ通信することで、CloudFrontからロードバランサー、ロードバランサーからEC2のWebページへアクセス出来るようになります。

##### 最終的には今までのドメイン名で通信をしたいので、この後Route53でCloudFrontのドメインと今までのドメインを紐づけていきます。

## Route53の設定（Cloudfrontとの紐付け）

1. Route53の画面に戻り、`レコードを作成`を選択
1. ルーティングポリシー：`シンプルルーティング`を選択
1. `シンプルなレコードを定義`を選択
1. レコード名：`blog`と入力（albに変更する前のもの）
1. 値/トラフィックのルーティング先：`CloudFrontディストリビューションへのエイリアス`を選択
1. 下の入力欄では作成したCloudFrontのドメイン名を選択
1. `シンプルなレコードを定義`を選択
1. `レコードを作成`を選択

#####　`blog.[ドメイン名]`のドメインはCloudFrontと紐づいており、`alb`から始まるドメインは直接ロードバランサーのドメインを紐づいています。

##### つまり、`blog.[ドメイン名]`のページはCloudFrontでキャッシュされたページが表示されていることになります。