CloudFrontにキャッシュしたS3上のWordPress記事に独自ドメインでアクセスする

# はじめに
最終的には以下のような構成を目指して構築します。
![WordPress Architecture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/9e905b0f-b083-2924-9b18-8b88b49d0bb7.jpeg)

構築作業の覚書としてQiita記事を作成しておきます。
また、この記事ではRoute53経由で、CloudFrontでキャッシュしたS3上の記事にアクセスする方法を記載します。
![WordPress Architecture_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/01b2a391-c4aa-d285-19ba-83ed4937b64c.png)

前段のEC2とS3の部分は以下の記事で。
[WordPressで作成した記事をS3に連携しエンドポイントでホスティングする](https://qiita.com/ebipilaf/items/ab93cbf57d09cc73ff5f)

# 本アーキテクチャのメリット
- ColoudFront
  - CDNを咬ますことで負荷に強くなったりレンダリング速度が上がる
  - S3、Route53との連携が簡単
- サーバー容量も気にしなくて良い（訳ではないが、EC2に直接配置するよりはまし）
  - WordPressが稼働できればいいのでインスタンスタイプも小さくてよくなる
- [Route53は可用性100%](https://aws.amazon.com/jp/route53/sla/)

# 構築手順

## 前提
ドメインを[お名前.com](https://www.onamae.com/)等で取得していることが前提になっています。
後述のRoute53で一緒に取得してもいいんですが、すでにお名前.comで取得していたのでそのドメインを使用することにしました。

## Route53でホストゾーンを作成する
[ドメイン名]に使用するドメインを入力してホストゾーンを作成します。
![Route53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/476d00de-379b-c007-24d2-3a127877db23.png)

## ACM(Amazon Certificate Manager)で証明書を作成する
実運用のことを考えるとSSL化は必須なので、SSL証明を用意します。
CloudFrontで使用する場合はバージニアリージョン(us-east-1)で作成する必要があるとのこと。
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-requirements.html#https-requirements-aws-region

1つも証明書を作成していない場合、以下のような画面が表示されますのでリージョンをバージニア(us-east-1)に変更し [証明書のプロビジョニング] の [今すぐ始める] を押下する。
![ACM_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/130af4e8-a552-fad4-dc81-1008c92bb4f6.png)

[パブリック証明書] を選択し [次へ] を押下します。
![ACM_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/098cf85b-1a64-88b4-1c5e-1d697b3c7c72.png)

[ドメイン名] にドメイン名を入力して [次へ] を押下します。
![ACM_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/818ba1de-f26e-148f-c356-add5c5234b0f.png)

ドメインの検証方法を選択します。
どちらでも検証自体は可能ですが、今回は [DNSの検証] を選択します。
![ACM_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/db0d9203-a602-488d-4e0a-23869af312d8.png)

入力した内容と相違なければ [確定とリクエスト] を押下します。
![ACM_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/b1ed371b-9953-5275-87f4-5eda8a33b57c.png)

ここまで設定を行うと、証明書が`検証保留中`という状態になります。
証明書の発行にはこの検証（今回選択しているのはDNSの検証）を終える必要があるので、各種設定を行いDNSの検証が通るようにしていきます。
DNSの設定値が記載されたCSVファイルでダウンロードできるので、ダウンロードして一旦終了です。

## Route53に情報を登録する
ダウンロードしたCSVにDNSに設定するレコード名とCNAMEが記載されているので、先ほど作成したRoute53のホストゾーンにレコードを追加していきます。

- [Record Name] の値を [名前] に設定
- [Record Value]の値を [値] に設定

![Route53_CNAME.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/ad15ecec-e09a-7519-4c97-d1ecf5433bc0.png)

## お名前.comでネームサーバーを変更する
Route53を使用して名前解決を行えるように、お名前.com側でネームサーバーの変更を行います。
※操作方法は割愛
ネームサーバー名はRoute53で確認できます。
![Route53_nameserver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/a175cb32-cb07-a3d5-cb26-9d2b9a768b91.png)

## ACMで検証が終わったか確認する
DNSへのCNAMEレコード追加とネームサーバーの登録が終われば、通常数分で検証が終わり証明書が発行されるはずです。
なお、ACMの検証猶予は72時間らしいので、もしそれまでに設定ができず検証ができなかった場合は、再度リクエストすればOKみたいです。
> もし 72 時間経っても ACM が DNS レコードを検証できず証明書を発行できなかった場合は、リクエストはタイムアウトし、検証状態は Timed out / タイムアウト と表示されます。やり直すには、新たにリクエストを作成する必要があります。

https://aws.amazon.com/jp/blogs/news/easier-certificate-validation-using-dns-with-aws-certificate-manager/

## CloudFrontのディストリビューションを作成する
ここからはCloudFrontの構築を行なっていきます。

[Create Distribution] を押下し、Webの方の [Get Started] を押下します。
![CloudFront_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/482a0173-5491-3a42-0fd5-73426890b8e0.png)
![CloudFront_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/1bac6298-12ed-cb83-fb6c-21179404bddf.png)

入力画面が表示されるので、以下の内容を設定し [Create Distribution] を押下します。

|項目|値|
|:---|:---|
|Origin Domain Name|アクセス先のS3バケット|
|Origin ID|Origin Domain NameにS3バケットを指定すると自動的に設定されます|
|Viewer Protocol Policy|Redirect HTTP to HTTPS|
|Alternate Domain Names(CNAMEs)|ドメイン名|
|SSL Certificate|Custom SSL Certificate (example.com)を選択し、先ほどACMで作成した証明書を指定する|
|Default Root Object|index.html（サイト仕様によって異なりますが、デフォルトだとこのファイルになるはず）|

するとディストリビューションの作成が始まりますが、これには少し時間がかかるので気長に待ちます。

## Route53にレコード追加
ディストビューションが作成されたら、ドメインへのアクセスをCloudFrontに流すためにRoute53の設定を行います。

- サブドメインを使用しない場合は [名前] は未入力でOK
- エイリアスは [はい] を選択
- [エイリアス先] にCloudFrontディストリビューションの [Domain Name]を指定 

![Route53_A_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/89df9b88-820f-ecaa-977f-b4b98e094ab8.png)

## 画面確認
ここまで設定を行うと、設定したドメインでWordPress記事にアクセスすることができるようになっているはずです。
![HelloWorld_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582190/ed0f50bb-06cc-5150-1c9b-1bb773d20e48.png)

## S3のホスティング解除
CloudFrontにキャッシュしたものを参照するようになるので、もうS3でホステイングする意味はありません。
※エンドポイントでのアクセス経路を残しておきたい等のであれば別ですが...
なので、ここまできたらホスティングはOFFにしてしまいましょう。

# 参考文献
参考にさせていただきました。ありがとうございました。
https://qiita.com/yujiro0102/items/8a58fa92b861edd14547
https://dev.classmethod.jp/cloud/aws/tls-for-s3-web-hosting-with-cloudfront/