Route53 でサブドメインを使いたい（独自ドメインの S3 ウェブサイトホスティング検証）

AWS アカウント A で親ドメインを管理し、別の AWS アカウント B でサブドメインを使用できるように設定します。
また、S3 ウェブサイトホスティングの機能を使用して独自ドメイン（カスタムドメイン）でアクセスできるようにします。

# DNS の委任についておさらい
委任とは、管理対象の一部分を別の管理者に委ねる仕組みのことです。
指定されたドメイン名を頂点とする別のゾーンを作り、管理を委ねることを「DNS の委任」とか、「サブドメインの委任」とかいいます。
下の図では、「emiki.jp」のサブドメイン「hoge.emiki.jp」が存在し、サブドメインを委任されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/7a77cdd9-1b8e-1c86-47d7-df3f027c4916.png)

委任するドメイン名の NS レコードを親ゾーンに追加することで、子ゾーンが作成され、サブドメインが委任された状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/6a5da7f5-0638-443a-714b-96058ceb76f7.png)

AWS では DNS のマネージドサービスとして Route53 があります。
AWS アカウント A の Route53 でホストしているドメイン「emiki.jp」のサブドメイン「hoge.emiki.jp」を別の AWS アカウント B の Route53 に委任するには、AWS アカウント B でホストするサブドメイン「hoge.emiki.jp」ゾーンの NS レコードを AWS アカウント A の「emiki.jp」ゾーンに登録すればよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/540282c9-7ae1-5bb2-f660-24f58bcbd7cd.png)

# 検証
以下の手順で検証します。

1. 独自ドメインを取得
2. AWS アカウント A でホストゾーン作成
3. 独自ドメインを取得したレジストラのサイトで NS レコードを登録する
4. AWS アカウント B でサブドメインのホストゾーン作成
5. AWS アカウント A の Route53 で NS レコードを登録する
6. S3 ウェブサイトホスティングの設定をする
7. 独自ドメイン（カスタムドメイン）で S3 でホスティングしているサイトにアクセスする

## 1. 独自ドメインを取得
独自ドメインを取得します。
様々なドメイン管理会社（レジストラ）がありますが、私はさくらのドメインで「emiki.jp」ドメインを取得しています。

https://domain.sakura.ad.jp/

Route53 でもカスタムドメインを取得できます。詳細は以下リンクを参照ください。
AWSアカウント利用料とドメイン登録費用の請求を一本化できたり AWS サービスやリソースとの親和性が高い等のメリットがあります。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/getting-started-s3.html#getting-started-find-domain-name

## 2. AWS アカウント A でホストゾーン作成 
親ドメインを管理する AWS アカウント A で操作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/31a62417-ee37-d6e0-31e6-81092c0f2bdb.png)

- AWS アカウント A で Route53 のコンソール画面を開き、[ホストゾーン] - [ホストゾーンの作成]
- ドメイン名、説明を入力して「ホストゾーンの作成」
- 「正常に作成されました」と表示されたら OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/5a597665-031e-b3f4-8398-c05e4ae064e6.png)

## 3. 独自ドメインを取得したレジストラのサイトで NS レコードを登録する
Route53 で作成した「emiki.jp」ホストゾーンの NS レコードに記載されているネームサーバー名を独自ドメインを取得したレジストラのサイトに登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a3e28521-63bf-5577-3e40-526f4fc5675e.png)

私はさくらのドメインで「emiki.jp」ドメインを取得していますので、さくらのドメインの会員ページにログインし、ドメインの Whois 情報編集画面でネームサーバーを登録しました。
以下の図のように、Route53 で確認した NS レコードに記載されているネームサーバーを 4 つ登録しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b220b248-8b41-131a-db03-0cf953c1f086.png)

ネームサーバーの変更が反映されるまで少し時間がかかります。
利用するレジストラによりますが、さくらのドメインの場合は 30 分～ 1 時間程度で変更が反映されました。
手元の Windows クライアント端末のコマンドプロンプトで `nslookup -type=ns 取得したドメイン名` を実行すると、以下のようにネームサーバー情報が更新されたことが確認できます。

```
C:\Users\user>nslookup -type=ns emiki.jp
サーバー:  UnKnown
Address:  2405:xxxx:xxxx:xxxx::x

権限のない回答:
emiki.jp        nameserver = ns-xxxx.awsdns-xx.co.uk
emiki.jp        nameserver = ns-xxxx.awsdns-xx.com
emiki.jp        nameserver = ns-xxxx.awsdns-xx.net
emiki.jp        nameserver = ns-xxxx.awsdns-xx.org

C:\Users\user>
```

## 4. AWS アカウント B でサブドメインのホストゾーン作成
AWS アカウント B でサブドメインのホストゾーン作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/7469cefa-8d65-d9bf-04f0-0c75b5a3085d.png)

- AWS アカウント B で Route53 のコンソール画面を開き、[ホストゾーン] - [ホストゾーンの作成]
- サブドメイン名、説明を入力して「ホストゾーンの作成」
- 「正常に作成されました」と表示されたら OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/36161492-825e-6dc0-5c16-8baf4e6f96bf.png)

## 5. AWS アカウント A の Route53 で NS レコードを登録する
AWS アカウント B の Route53 で作成した「hoge.emiki.jp」ホストゾーンの NS レコードに記載されているネームサーバー名を、AWS アカウント A の Route53 に登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/4289c952-e9d3-9457-faf2-a5754766247d.png)

AWS アカウント B の Route53 で作成した「hoge.emiki.jp」ホストゾーンの NS レコードに記載されているネームサーバー名をコピーして控えておきます。

AWS アカウント A で操作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/de43d4d6-b9bb-5cbb-ec82-d517c813856c.png)

- AWS アカウント A の Route53 コンソール画面を開き「レコードの作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/fa63d01b-7823-a512-0ccc-d207846fd81e.png)

- レコード名：サブドメインの頭の文字列を入力
- レコードタイプ：NS-ホストゾーンのネームサーバー
   - レコード名にサブドメインの頭の文字列を先に入力しないと NS レコードを選択できないので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/69988bc0-9478-5a7f-1084-1c223a7e69fe.png)

- 「値」に AWS アカウント B の Route53 で作成した「hoge.emiki.jp」ホストゾーンの NS レコードに記載されているネームサーバー名を入力
   - 各ネームサーバー名の末尾の「.（ルート）」は入力しない
- 「レコードを作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/deafdc29-f3a5-8c6d-893a-80ea2f218459.png)

- 「レコードが正常に作成されました」と表示されたら OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/8b6c6b00-5cce-bc05-d231-646f2cc46fc1.png)

これでサブドメインの委任の設定ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/61580c3b-7ca0-918e-df3d-5f9123988954.png)

## 6. S3 ウェブサイトホスティングの設定をする
ここからはおまけです。
サブドメインの委任ができたので、独自ドメイン（サブドメイン）を使って S3 でホストしたウェブサイトにアクセスできるか検証してみます。

サブドメインのホストゾーンがある AWS アカウント B で操作していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/15aa6194-7801-89aa-cb10-be91986cdea7.png)

- S3 コンソール画面を開き [バケット] - [バケットを作成]
- バケット名：サブドメイン名（今回は「hoge.emiki.jp」）
- AWS リージョン：今回は ap-northeast-1
- オブジェクト所有者：ACL 無効（デフォルト）
- パブリックアクセスをすべてブロック：チェックを外す
   - 「オブジェクトが公開される可能性があることを承諾します」にチェックする
- その他の設定はデフォルトのまま「バケットを作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/70f0aae9-b055-3ac3-56f2-49e80c73dbfa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/ba6f21ea-541e-8e5d-346b-53fb7552dd49.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/bcf3a279-be5c-e6cb-e91b-3bb5c5dfe5b5.png)

- 作成したバケットの詳細を開きプロパティタブで画面下部までスクロースして「静的ウェブサイトホスティング」の「編集」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/5f4e5a55-27fa-23d1-9609-1770ffea36fb.png)

- 静的ウェブサイトホスティング：有効にする
- インデックスドキュメント：index.html
- その他の設定はデフォルトのまま「変更の保存」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/d8a0be8a-ce83-d825-5d82-f0b322dbc29f.png)

- 「正常に編集されました」と表示されている
- 静的ウェブサイトホスティングの項目にウェブサイト URL が表示されているが、 S3 バケットポリシーの設定をしていないのでまだアクセスできない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3c4cfc79-bb87-c2b7-000b-63b1367ae17a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/dcaf8627-d946-f5fc-4f76-44dd44f7b046.png)

- アクセス許可タブの「バケットポリシー」項目で「編集」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/1f1ee4a9-9487-6708-2c13-1ceac4cdbe6e.png)

- 以下のポリシーを記載する
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::S3バケット名（サブドメイン名）/*"
        }
    ]
}
```
- 「変更の保存」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/7d21d59d-c4eb-ee3d-43ed-ef326fb79aa4.png)

- 「バケットポリシーが正常に変更されました」と表示される
- S3 バケットのオブジェクトが公開状態になっている
- まだウェブサイトのインデックスドキュメント「index.html」ファイルを作成していないので 404 エラーとなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/2ad1f192-791b-de99-e4e2-0bdd55cd195c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/877d6a1c-5ae6-3e6a-ba65-1c154765f965.png)

- 以下のように「index.html」ファイルを作成し、S3 バケットにアップロードする
   - ※タイトルや本文は自由に記載してください
   - ※`<meta http-equiv="content-type" charset="utf-8">` の箇所は日本語の文字化けを防ぐためにいれています
```html:index.html
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <meta http-equiv="content-type" charset="utf-8">
    <title>My Website Home Page</title>
</head>
<body>
  <h1>Welcome to my website</h1>
  <p>Now hosted on Amazon S3!</p>
  <p>hoge.emiki.jp というサブドメインを使用して S3 の静的 Web サイトにアクセスできました</p>
</body>
</html>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e5c757c7-4993-fa72-edb3-6d0e774bae87.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/39a68d9c-4dbd-6b41-f078-7cca2bee3f64.png)

- 「index.html」ファイルをアップロードすると、ウェブサイトの URL でトップページが表示されるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/8428801c-0eb4-5798-4ff1-30931c65d2fc.png)

## 7. 独自ドメイン（カスタムドメイン）で S3 でホスティングしているサイトにアクセスする
Route 53 でサブドメインのホストゾーンに A レコード（エイリアスレコード）を追加し、独自ドメイン（カスタムドメイン）で S3 でホスティングしているサイトにアクセスできるようにします。

- Route53 コンソール画面を開きサブドメインのホストゾーンの詳細画面で「レコードを作成」 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/0e21eb22-0ff6-5602-7ab2-b7c54305737f.png)

- レコードタイプ：A
- エイリアス：チェックをオンにする
- トラフィックのルーティング先
   - エンドポイントを選択：S3 ウェブサイトエンドポイントへのエイリアス
   - アジアパシフィック（東京）（ap-northeast-1）
   - s3-website-ap-northeast-1.amazonaws.com.
- 「レコードを作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/486207e8-56af-72b6-144c-21c1c9cae119.png)

- 「レコードが正常に作成されました」と表示される
- 「ステータスを表示」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/570c6702-f488-d8fa-9153-af6ba92902d3.png)

- 少し待つとステータスが「PENDING」⇒「INSYNC」に変化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/417d6d32-f9ff-27e0-7deb-531986978857.png)


- サブドメイン名にブラウザでアクセスすると、トップページが表示されるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a5709901-6531-b386-5f55-0ccb44bb8679.png)

独自ドメイン（サブドメイン）を使って S3 でホストしたウェブサイトにアクセスできました。

# 参考
https://www.nadukete.net/domain-guide/beginners/subdomain.html

https://domain.sakura.ad.jp/

https://jprs.jp/glossary/index.php?ID=0152

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html#root-domain-walkthrough-configure-bucket-aswebsite

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html#add-bucket-policy-root-domain

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html#upload-website-content

https://blue-bear.jp/kb/html-uft-8%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%82%92%E9%98%B2%E3%81%90%E6%96%B9%E6%B3%95/