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

##環境
* Amazon Web Service

    * EC2(Amazon Linux 2 , t2.micro , 汎用SSD 8GB)
    * RDS(MySQL , db.t2.micro)
    * ALB

* ローカルPC
    * MacBook Pro(2.9 GHz デュアルコアIntel Core i5 , 8 GB 2133 MHz LPDDR3)
    * macOS 11.3.1（20E241）

##概要
キャッシュサーバを配置する。
構成図上は、キャッシュサーバが１つだが実際には複数ある。
![構成図14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/24768c6a-4fc7-047a-dff6-352a6335547d.png)

###通信の流れ
**クライアント**
alb.yoshiki-mbp.comにアクセスするとオリジン(Webサーバ自身)に直接アクセスでき、
blog.yoshiki-mbp.comにアクセスするとキャッシュサーバ(CloudFront)にアクセスできるようにする。
**キャッシュサーバ**
60秒ごとにオリジンからコンテンツを取得して、クラインアントへ表示する。

![CloudFront.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/fb2c2626-ee8c-2502-6e93-e737171ff5b6.png)

##キャッシュサーバを配置
###Aレコードを編集する
現状のRoute 53の設定だと、クライアントが[blog.yoshiki-mbp.com](blog.yoshiki-mbp.com)にアクセスしようとすると、Route53がALBのDNS名(セカンダリでS3の静的sorryページ)を返してくれて、そこにアクセスすることになっていた。
それを、[alb.yoshiki-mbp.com](alb.yoshiki-mbp.com)にアクセスした時にその動作をするように編集する。要は[通信の流れ の画像](#通信の流れ)の右側のAliasレコードを作成する。

1. レコード編集のページへ遷移
<br>`Route 53　＞　ホストゾーン　＞　yoshiki-mbp.com`をクリックする。
1. レコードを編集する。
<br>レコード名が[blog.yoshiki-mbp.com](blog.yoshiki-mbp.com)であるAレコード２つを[alb.yoshiki-mbp.com](alb.yoshiki-mbp.com)にする。

レコード名|タイプ|ルーティングポリシー|差別化要因|値/トラフィックのルーティング先
---|---|---|---|---
alb.yoshiki-mbp.com|A|フェイルオーバー|プライマリ|dualstack.lb-1-xxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com.
alb.yoshiki-mbp.com|A|フェイルオーバー|セカンダリ|s3-website-ap-northeast-1.amazonaws.com.

###証明書をどのサブドメインでも使えるようにする
現状は、`blog.yoshiki-mbp.com`の固定の名前になっているため、どのサブドメインでも使用可能なようにワイルドカードを使用した証明書を作成し、適用する。

1. 既存のリスナーを削除する。<br>`ロードバランサー　＞　(作成したALB)　＞　リスナー`をクリックして、表示されるHTTPSのリスナーを削除する。<br><br>
1. リスナーの追加
`リスナーの追加`をクリックして、以下の項目を記入する。

   * プロトコル: `HTTPS`
    * ポート: `443`
    * アクションの追加　＞　転送先
        * ターゲットグループ: `TG-1`
        * チェックボタンをクリック
    * 新しい ACM 証明書をリクエストをクリックする。ここの手順は[ACM 証明書をリクエストする](#ACM 証明書をリクエストする)にて説明する。
    * デフォルトの SSL 証明書:
        * `ACMから`
        * (作成した証明書が表示されるはず)
    * `リスナーを作成`をクリックする。

###ACM 証明書をリクエストする
新しくワイルドカードによって、全てのサブドメインで使用できる証明書を作成する。

1. ドメイン名の追加
<br>`*.yoshiki-mbp.com`を入力する。
1. 検証方法の選択
<br>DNSの検証を選択する。
1. タグを追加
<br>今回は無し
1. 確認とリクエスト
<br>今回は無し
1. 検証
<br>`Route53でのレコードの作成`
1. 既存のCNAMEレコードを削除
<br>上記の操作によって、新しくCNAMEレコードが作成されているので、古い既存のCNAMEレコードを削除する。
1. 既存の証明書を削除
<br>新しく証明書が作成されているはずなので、古い既存の証明書を削除する。

###CloudFront用の証明書を作成
CloudFrontとALBでHTTPS通信を行うため、それぞれで証明書が必要だが、CloudFront１は`バージニア北部`リージョンでしか作成することができない。

1. リージョンを`バージニア北部`に変更する。
1. 証明書作成ページへ遷移。
<br>`ACM　＞　証明書のプロビジョニング　＞　今すぐ始める`をクリックする。
1. 証明書のタイプ: `パブリック証明書のリクエスト`
1. ドメイン名の追加
<br>`*.yoshiki-mbp.com`を入力する。
1. 検証方法の選択
<br>DNSの検証を選択する。
1. タグを追加
<br>今回は無し
1. 確認とリクエスト
<br>今回は無し
1. 検証
<br>`Route53でのレコードの作成`

###CloudFrontの作成
1. CloudFront作成のページへ遷移する。
<br>`CloudFront ＞　CreateDistribution`をクリックする。
1. Select a delivery method for your content.
<br>Webを選択して、Get startedをクリックする。
1. 以下の項目を入力していく。
    * Origin Domain Name: `alb.yoshiki-mbp.com`
    * Origin Protocol Policy: `HTTPS Only`
    * Viewer Protocol Policy: `HTTPS Only`
    * Cache Policy: `ShortTTLCache`　(以下の内容で作成したCacheを適用する。)
        * Name: `ShortTTLCache`
        * MinimumTTL: `60`
        * MaximumTTL: `60`
        * DefaultTTL: `60`
    * SSL Certificate: `Custom SSL Certificate`
      <br>先ほどバージニアリージョンで[作成した証明書](#CloudFront用の証明書を作成)を適用する。
    * Alternate Domain Names: `blog.yoshiki-mbp.com`
1. CloudFrontのDomainNameでWebページが開けることを確認。
<br>`https://dxxxxxxxxxxxx.cloudfront.net`にアクセスする。

###CloudFrontのドメインと独自ドメインの紐付け
最終的に実施したいのは、独自ドメインをURLとしてアクセスした時に、CloudFrontにあるWebページにアクセスすることなので、それぞれのドメインの紐付けを行う。

1. レコードの作成ページへ遷移する。
`Route 53　＞　ホストゾーン　＞　yoshiki-mbp.com　＞　レコードを作成`をクリックする。
1. 以下の項目を入力する。
* トラフィックのルーティング先
    * レコード名: `blog.yoshiki-mbp.com`
    * レコードタイプ: `Aレコード`
    * エンドポイント: `CloudFrontディストリビューションへのエイリアス`
    * ディストリビューション: `dxxxxxxxxxxxxx.cloudfront.net`
    * ルーティングポリシー: `シンプルルーティング`
1. `レコードを作成`をクリックする。