独自ドメインでCloudFront + S3 Webホスティング環境構築

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

以前、CloudFront + S3を使って静的なWebホスティング環境を構築しました。

https://qiita.com/ohtsuka-shota/items/8846891eea0ccf8bcec6

https://qiita.com/ohtsuka-shota/items/127ebc8e636c60b0379d

今回はRoute53とACM(AWS Certificate Manager)を使って、この環境を独自ドメイン化したいと思います。
※尚独自ドメインはお名前.comで取得しています。

https://qiita.com/ohtsuka-shota/items/af39a7c40c61ec13c5cd

# 環境イメージ
今回の構築イメージは以下となります。
ACMを使ってお名前.comから払い出したohtsuka-aws.xyzを認証する証明書を払い出します。それをRoute53に作成しているPublic Hosted Zoneに紐づけます。またCloudFront用の独自ドメインのAレコードを登録します。
ユーザは独自ドメインを使ってCloudFrontに接続することが出来るようになります。
![20240620から-ページ26.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/bce68a91-fb36-adc2-4691-9e4b758456b6.png)

# 環境構築
## ACMでの証明書払い出し
ACMの管理画面に移動します。この時リージョンは必ず米国東部（バージニア北部）としてください。
CloudFrontをSSL化する時はこちらのリージョンであることがマストになります。
証明書をリクエストのボタンを押下します。
![Untitled (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/da58c9ae-30d6-2151-48bd-6d171520e0df.png)
デフォルトでパブリック証明書をリクエストが選択されている状態かと思います。
このまま次に進みます。
![Untitled (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1753e1e3-17d4-87e9-79d8-c284c3a69ac1.png)
ドメイン名のところにお名前.comで取得したドメインであるohtsuka-aws.xyzと*.ohtsuka-aws.xyzを入力します。アルゴリズムはDNSを選択します。
設定できましたらリクエストを押下します。
![screencapture-us-east-1-console-aws-amazon-acm-home-2024-07-13-18_11_39 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d6be663f-deae-3bd1-cf0f-4e95b75324ac.png)
作成が完了しました。但しステータスが保留中の検証となっているかと思います。これを解消する為、ドメイン欄のRoute53にレコードを作成ボタンがありますのでこれを押下していきます。
![screencapture-us-east-1-console-aws-amazon-acm-home-2024-07-13-18_12_11 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/4822193b-6c62-d278-a884-69356a7e203b.png)
先程登録した2つのドメインが自動で選択される状態で画面に表示されておりますので、そのままレコードを作成を押下します。
![screencapture-us-east-1-console-aws-amazon-acm-home-2024-07-13-18_12_28 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2937fb48-8b15-e902-a0be-71f644dc548a.png)
Route53のホストゾーンにCNAMEで登録されていることが確認できます。
![Untitled (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5744ea42-439a-332b-13fe-b785c5f66d70.png)
ACMの管理画面でもステータスが発行済みになっていることを確認します。
![screencapture-us-east-1-console-aws-amazon-acm-home-2024-07-13-18_13_44 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b3dc0097-ee1e-ebc4-a4ee-a41e389c76ef.png)

## CloudFront ディストリビューションを作成する
CloudFrontの管理画面に移動して新しいディストリビューションを作成します。
![Untitled (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e9847580-c1ba-f3e7-4386-d13a0dd9fdcc.png)
Origin DomainはS3のバケットを選択します。これは以前掲載した通りで問題ありません。
ビューワープロトコルポリシーはRedirect HTTP to HTTPSを選択します。
代替ドメインは、あとから作成するRoute53のAレコードと併せる必要があるので注意です。私は"https:\//s3.ohtsuka-aws.xyz"と入力したら、S3にデプロイしている静的Webサイトにアクセスしたいと思っているので、ここでもs3.ohtsuka-aws.xyzと記載をしております。
Custom SSL certificate 欄ではACMで払い出している証明書を指定します。
デフォルトルートオブジェクトにはindex.htmlと入力しておきます。
この状態でディストリビューションをデプロイします。
![screencapture-us-east-1-console-aws-amazon-cloudfront-v4-home-2024-07-13-19_06_09 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e8797f30-8afe-b6d9-9f92-2afd4ebd2501.png)
デプロイ直後の画面が以下となります。
![screencapture-us-east-1-console-aws-amazon-cloudfront-v4-home-2024-07-13-19_06_38 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/aaa71785-900d-a0e3-4ce9-72bf8e34b4dd.png)

## Route53にAレコードを登録する
ホストゾーン画面を開いて、レコードを作成ボタンを押下します。
![Untitled (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3978179f-6c0d-00f6-fe85-6140fd8d7603.png)
レコード名はs3.ohtsuka-aws.xyzとしました。
タイプはAレコードでOKです。
エイリアスを有効化してCloudFrontディストリビューションのエイリアスにして、先ほど作成したものを選択します。この状態でレコードを作成します。
※若干挙動が微妙でもしかするとディストリビューションのエイリアスを選択しても候補が表示されないことがあるかもしれません。その時は一旦レコード名を空白してみたあとに改めて確認するといいかもしれません。
![screencapture-us-east-1-console-aws-amazon-route53-v2-hostedzones-2024-07-13-19_11_24 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9afc2125-1fdf-5423-a93a-0a4a8f1294a7.png)
レコード一覧に表示されていることを確認します。
![Untitled (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e9955c7d-832f-ab14-c1da-8cdb65cea755.png)

## 接続確認
Aレコード登録後10分ほど待機すると登録したドメイン、今回はs3.ohtsuka-aws.xyzの名前解決が出来るようになり、Webブラウジングが可能となります。
実際にアクセスした図が以下となります。
S3に格納したindex.htmlやerror.htmlが表示されることが確認できると思います。
![Untitled (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1644e340-70e0-7f33-7873-44c1b4694800.png)
![Untitled (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/27c675fe-3b92-5167-ce66-952d7e2ca1aa.png)
証明書の内容を確認するとCNに私の独自ドメインが表示されています。ACMで払い出した証明書が使われていますね。
![Untitled (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/aa02c7c5-b938-17fa-bf0a-6ef0efe37cdd.png)
ちなみに独自ドメインを使わないでディストリビューション名を使ってアクセスした際は以下のように表示されます。
![Untitled (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/dd1dd578-3cf8-9a0f-a37b-b0ed5d4752de.png)
![Untitled (27).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/753e02bc-c582-a816-4120-ed736a460f03.png)

# 【備忘録】私が確認したトラブル
忘れないようにするために、この環境を構築する前に確認したエラー内容を備忘録的な感じで雑に吐き出しておきたいと思います。

CloudFrontのディストリビューションの代替ドメイン名とRoute53のAレコードで内容が一致していないと10分経過しても以下のようなエラーが表示され、いつまでもアクセスできるようになりません。
![Untitled (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/0f52f560-38ed-769d-d333-4e314cc520a2.png)
```
このサイトは安全に接続できません
s3.ohtsuka-aws.xyz ではサポートされていないプロトコルが使用されています。
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
```