S3コンテンツをCloudFrontでHTTPS配信(独自ドメイン)してみた

#目次
[1.はじめに](#はじめに)
[2.前提](#前提)
[3.s3コンテンツの準備](#s3コンテンツの準備)
[4.acmの証明書発行](#acmの証明書発行)
[5.cloudfrontディストリビューションの作成](#cloudfrontディストリビューションの作成)
[6.route53のレコード設定](#route53のレコード設定)
[7.cloudfrontのoai設定](#cloudfrontのoai設定)
[8.まとめ](#まとめ)

#はじめに
静的コンテンツを配信する方法として、S3の「静的Webサイトホスティング」があります。設定が簡単で使いやすい機能ではありますが、こちらを有効にした場合、公開されるS3バケットのURLは「http://[バケット名].s3-website-[region].amazonaws.com/~」となり、S3までの通信がHTTPとなります。今回、よりセキュアなHTTPS通信での配信が可能な、CloudFrontとACM (AWS Certificate Manager)を使用した環境を構築しましたので、おおまかな手順を残しておきたいと思います。

#前提
今回、構築したAWS環境の構成は以下の通りとなります。
![インフラ構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/efc126bf-72b3-2ac7-7892-89a2ef60708a.png)

以降の構築手順における前提を記載します。

- 無料で使用できるドメインプロバイダ「Freenom」で独自ドメインを取得済 <br> ※ 今回は「aws-uni.ga」
- Freenomで取得したドメインに対するRoute53のパブリックホストゾーンを作成済
- Freenomのマイドメイン管理画面でNameServerにAWS Route53のDNSサーバを指定済

※ Route53：パブリックホストゾーンの設定
![53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/59643597-58bb-6016-8780-79953436bbb7.png)


上記のような前提のもと、CloudFrontとACMを使用したHTTPS配信環境を構築しましたので、おおまかな手順をまとめていきます。

#s3コンテンツの準備
###S3バケットの作成
まずは今回、CloudFrontで配信するコンテンツを格納するためのS3バケットを作成します。

- S3の画面から「バケットを作成」を押下する。
 
![バケット作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/17615322-6e23-3446-eb66-4edf3d513d29.png)

- 以下のバケット設定を行い、画面右下のバケットを作成」を押下する。 <br>
・バケット名を入力　※ 取得した独自ドメイン名を入力した。<br>
・AWSリージョンを選択　※ 東京リージョンとした。 <br>
・「パブリックアクセスをすべてブロック」にチェックが入っていることを確認 

![バケット作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/a4d9bc5f-8019-203c-c09a-441c043b2544.png)

- バケットが作成されたことを確認し、名前の部分を押下する。
![作成済.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/c8f46d7d-0a67-0fc0-810b-70963ba4207a.png)

###S3コンテンツのアップロード

- バケットが空の状態であることを確認し、「アップロード」を押下する。

![アップロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/f5a5e31a-ceaa-3a4b-5eca-9d099615087a.png)

- アップロード画面に遷移するので、「ファイルを追加」を押下する。
![ファイル追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/ad680801-255f-cef5-ee58-f63a2a5b8de7.png)

- アップロードしたいファイルを選択の上、右下の「アップロード」を押下する。
![ラストアップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/76a85ae9-146f-dcd6-5128-c9275eab30ff.png)

- S3バケットにファイルがアップロードされたことを確認する。
![アップ済.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/ee4b71cb-bc39-fc72-e812-a6f81e64fd8b.png)

以上で、S3コンテンツの準備は完了になります。

#acmの証明書発行
続いて、ACM (AWS Certificate Manager)にて証明書を発行していきます。

- ACMの画面にて、「証明書のプロビジョニング」の「今すぐ始める」を押下する。 <br>
※ CloudFront ディストリビューションに関連付ける SSL 証明書は「米国東部 (バージニア北部) (us-east-1)」 リージョンで実施する必要がある。

![ACM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/3adc9324-78dc-20fa-6666-b5f46f1d8053.png)

- 「パブリック証明書のリクエスト」にチェックが入っていることを確認し、「証明書のリクエスト」を押下する。
![証明書リクエスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/00ebf8d2-a9e8-fb8c-83d9-f17e4b99bbfb.png)

- 「ドメイン名」を入力し、「次へ」を押下する。<br> ※ 今回は独自ドメイン「aws-uni.ga」を入力した。
![ドメイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/7c7d5e98-a429-0841-b4a7-a6c3ba9848ef.png)

- 検証画面の選択に遷移するので、「DNSの検証」にチェックが入っていることを確認し、「次へ」を押下する。
![検証.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/7d5891f1-71a9-8a7b-1bac-dda4558ec746.png)

- タグの追加画面に遷移するので、必要に応じて、「タグ名」と「値」を入力し、「確認」を押下する。
![タグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/d07a3d99-bb61-dd22-cf46-d2acfcae1439.png)

- 確認画面に遷移するので、内容に問題がなければ「確定とリクエスト」を押下する。
![確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/838c821a-e4a9-fdab-756e-ed6378c17ca8.png)

- 指定したドメインにて、検証状態が「検証保留中」になる。ドメインのDNS設定にCNAMEレコードを追加すべく、「Route53でのレコードの作成」を押下する。
![レコード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/929887fa-fa08-a5de-a9c9-2731c9ae9e7f.png)

- 右下の「作成」を押下する。
![作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/7f972ecc-1158-4dc7-f4d8-c31d897f99a9.png)

- Route53でCNAMEレコードが作成されると、ドメインの検証状態が「成功」になり、証明書の状況も「発行済み」となる。
![証明書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/8446f446-47cf-320a-5a79-5f558d1b3f9f.png)

以上で、ACMの証明書発行は完了になります。

#cloudfrontディストリビューションの作成
続いて、CloudFrontディストリビューションの作成をしていきます。

- CloudFrontの「Distribution」画面にて、「Create Distribution」を押下する。
![Front.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/1f62ee09-f7b9-f793-9990-ca499eb8b64d.png)

- 「Get Started」を押下する。
![メソッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/d4197de3-0ac6-6647-6ce4-a3cc87894e1c.png)

- ディストリビューションの作成画面に遷移するので、「Origin Settings」にて、オリジンの設定をしていく。「Origin Domain Name」にて今回作成したS3バケットを選択する。「Origin ID」は自動入力される。その他の項目は必要に応じて設定する。
![Origin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/cad96265-e6ac-b2e9-454c-052d2a208170.png)

- 「Defalut Cache Behavior Settings」ではキャッシュに関わる設定などができるが、今回はデフォルトの設定とする。
![キャッシュ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/83010ecb-43df-8e19-6fa3-d68feca337af.png)

- 「Distribution Settings」でディストリビューションの設定をしていく。「Alternate Domain Names」に、ユーザがコンテンツにアクセスする際のドメイン名を入力する。「SSL Certificate」では「Custom SSL Certificate」にチェックを入れ、ACMで発行した証明書を選択する。

![ディストリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/576465c6-1d8b-57cc-4dce-ba15bf05b809.png)

- 「Defalut Root Object」でS3バケットにアップロードしたHTMLファイル名を入力する。
その他はデフォルトの設定とし、右下の「Create Distribution」を押下する。
![create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/a31b4b1c-6b08-4d88-f5f4-72fc19041a67.png)

- CloudFrontディストリビューションが作成され、「Status」が「Deployed」、Stateが「Enabled」となることを確認する。
![Dep.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/32e8034f-e484-43bf-b0f1-b33cf265d4b7.png)

以上で、CloudFrontディストリビューションの作成は完了になります。

#route53のレコード設定
続いて、Route53のレコード設定をしていきます。

- 独自ドメインのホストゾーン設定画面にて、上記、「ACMの証明書発行」手順内で作成された「CNAME」レコードが存在することを確認し、「レコードを作成」を押下する。
![Ro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/7da5a370-4e33-052d-01fc-5600750f0c01.png)

- 以下の通り、レコードの設定をし、「レコードを作成」を押下する。
・レコード名を入力　※ 今回は入力せずドメイン名のままとした。
・レコードタイプにてAレコードを選択
・ルーティングポリシーを選択　※ 今回はシンプルルーティングを選択した。
・トラフィックのルーティング先を選択 <br> ※上記、「CloudFrontディストリビューションの作成」手順内で作成したディストリビューションのドメイン名を選択する。
![A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/b0342bca-90e0-90ae-f69f-50335529f66e.png)

- CloudFrontディストリビューションのAレコードが作成されたことを確認する。
![A作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/c9eb4347-0b0e-9909-9bf9-bba3c6ad4305.png)

以上で、Route53のレコード設定は完了となります。

#cloudfrontのoai設定
- 諸々の設定が完了したので、ブラウザにて「ドメイン名」でアクセスを試みる。 
　
![Deny.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/619e5e3e-6e59-035f-9784-cf544a35980a.png)

→「AccessDenied」となり、S3にアップロードしたコンテンツが表示されない。これは現在、作成したS3バケットに、アクセスのためのポリシーが設定されていないからである。そこで今回、CloudFront経由でのみS3バケットにアクセスができるように、OAIの設定をしていく。

- CloudFrontで作成したディストリビューションのIDを押下する。
![ID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/10bde269-edee-72be-590c-2897eeaed917.png)

- 「Origin and Origin Groups」タブで「Edit」を押下する。
![edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/ea928595-1a04-399b-821c-29a340bd984a.png)

- 以下の通り、OAIの設定を行い、右下の「Yes,Edit」を押下する。
・「Restrict Bucket Access」で「Yes」を選択
・「Origin Access Identity」で「Create a New Identity」を選択
・「Comment」は自動入力される
・「Grant Read Permissions on Bucket」にて「Yes, Update Bucket Policy」を選択
![OAi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/93f11cb0-6aa3-5bba-cfd5-4ee3d67b5d61.png)

- ディストリビューションにてOAIが設定されたことを確認する。
![e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/3d508c2e-a807-2f9f-393b-bab2a5bbb1e8.png)

- S3のバケットポリシーにOAIの設定が反映されたことを確認する。![OAED.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/31725aaa-4dde-10f9-4eef-4c4e82830397.png)

- ブラウザにて独自ドメインのHTTPSアクセスを試みる。
![OK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/28018953-5135-1e8b-10fe-b9b4183dd840.png)


→S3バケットへアップロードしたコンテンツをCloudFront経由で表示することができた。

以上で、CloudFrontのOAI設定は完了となります。

#まとめ
以上より、CloudFrontとACMを使用したHTTPS配信環境を構築することができました。
今回の構築では、CloudFront設定はおおよそデフォルトのまま進めたので、細かいキャッシュの設定などはまた別の記事としてまとめていけたらなと思います。

以上、最後まで読んで頂きありがとうございました！

※この記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。