お名前.comでドメインを取得して、コンソール上でCloudFrontやRoute 53を触ってみた

# <font color="rgb(107, 142, 35)">目次</font>
* [はじめに](https://qiita.com/koji-koji-koji/private/bc6d31bbff03f343e63f#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)
* [要約](https://qiita.com/koji-koji-koji/private/bc6d31bbff03f343e63f#%E8%A6%81%E7%B4%84)
* [構成](https://qiita.com/koji-koji-koji/private/bc6d31bbff03f343e63f#%E6%A7%8B%E6%88%90)
* [お名前.comでドメインの登録](https://qiita.com/koji-koji-koji/private/bc6d31bbff03f343e63f#%E3%81%8A%E5%90%8D%E5%89%8Dcom%E3%81%A7%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E7%99%BB%E9%8C%B2)
* [構成①](https://qiita.com/koji-koji-koji/private/bc6d31bbff03f343e63f#%E6%A7%8B%E6%88%90-1)
* [構成②](https://qiita.com/koji-koji-koji/private/bc6d31bbff03f343e63f#%E6%A7%8B%E6%88%90-2)
* [構成③](https://qiita.com/koji-koji-koji/private/bc6d31bbff03f343e63f#%E6%A7%8B%E6%88%90-3)
* [終わりに](https://qiita.com/koji-koji-koji/private/bc6d31bbff03f343e63f#%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB)
* [その他参考記事](https://qiita.com/koji-koji-koji/private/bc6d31bbff03f343e63f#%E5%8F%82%E8%80%83%E8%A8%98%E4%BA%8B)

# <font color="rgb(107, 142, 35)">はじめに</font>
机上での理解は進めているものの、Route 53やCloudFrontをコンソール上であまり触ったことがなかったため、色々と試してみました。また、今までやったことのないドメインの取得にもチャレンジし、取得したドメインを使ってサーバーへのアクセス等も試してみました。



# <font color="rgb(107, 142, 35)">要約</font>
* お名前.comでドメインを取得して、Route 53でパブリックホストゾーンを作成しました
* Route 53にエイリアスレコードを作成し、S3でホストしているコンテンツへのアクセスを試しました
* ACMでSSL/TLS証明書を取得し、ALBに対してHTTPSでアクセスし、ALB経由でWebサーバーへのアクセスを試しました
* CloudFrontに対してHTTPSでアクセスし、CloudFrontからS3や、ALB経由でWebサーバーへのアクセスを試しました（この時、S3やALBへの直接アクセスを防ぐ設定も試しました）

# <font color="rgb(107, 142, 35)">構成</font>
Route 53やCloudFrontをコンソール上で触ってみることが目的だったため、EC2やNAT Gatewayはそれぞれ1つずつしか作成していません。下記のような構成①～③を試しました。

構成①：Route 53に登録したドメインを使ってS3バケットでホストする静的ウェブサイトにアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/0faeed05-fe18-e8ec-c86a-94de7211cc13.png)

構成②：Route 53に登録したドメインを使って、ALB経由でWebサーバー(EC2)にアクセス（ALBへはHTTPSで接続）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/b2dfb3f6-11d5-a1da-d886-a6f3ca6533f6.png)

構成③：Route 53に登録したドメインを使って、CloudFront経由で、S3やALB背後のWebサーバー(EC2)にアクセス（CloudFront、ALBへはHTTPSで接続）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/4b5a5268-fd20-bef7-5edc-e9212290c0ba.png)


# <font color="rgb(107, 142, 35)">お名前.comでドメインの登録</font>

国内最大級のドメイン公式登録サービスである「お名前.com」でドメインを登録しました。

https://navi.onamae.com/top

以降では仮に`test.com`を登録したとして話を進めていきます。（※下記キャプチャはマスクしています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/6295ca48-a91d-21ac-5fa8-c8d918ace862.png)

デフォルトではレンタルサーバーを利用するような設定になっており、そのままだと課金が発生するようでした。AWS上のサービスで十分だったため利用しない設定に変更して進めました。

### <font color="rgb(107, 142, 35)">Route 53の設定</font>
Route 53でパブリックホストゾーンを作成しました。ホストゾーンの設定画面で「お名前.com」で登録した`test.com`を指定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/db06a8fe-56d2-a5a4-b1f4-00f86be0c757.png)

ホストゾーンの作成が完了すると、デフォルトでNSレコードとSOAレコードが表示されました。このうち、NSレコードをお名前.comのネームサーバー情報に登録しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/6d460bfb-55aa-3459-6703-85c2b606f0d1.png)

:::note info
ネームサーバー情報に登録する際、NSレコードの末尾にある「.」は含めずに登録しました。
:::

:::note info
お名前.comでネームサーバー情報を登録（変更）すると反映されるまでに**数時間～72時間程度** かかると記載がありました。（私が実際に登録した際は、数十分程度で終わりました。）
:::

https://help.onamae.com/answer/8081

コマンドプロンプトを起動し、`nslookup -type=NS <登録したドメイン名>`でネームサーバーのアドレスが表示されることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2926433/b128d103-1bf5-a8c8-5ac4-b78e05b2d107.png)



# <font color="rgb(107, 142, 35)">構成①</font>

まず、Route 53に登録したドメインを使ってS3バケットでホストする静的ウェブサイトへのアクセスを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/c42c4d3d-64fd-50cf-a792-3b57d06f54dc.png)


### <font color="rgb(107, 142, 35)">S3の設定</font>

パブリックアクセスのブロックを**オフ**にして、Route 53のホストゾーンと**同じ名前で**S3バケットを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/3bfba5ba-1ba2-1b00-6602-5a15560a4bd0.png)

バケットポリシーに下記を設定しました。

```json: バケットポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "<作成したS3バケットARN>/*"
        }
    ]
}
```

また、公開するファイル（今回はindex.html）を格納しました。


### <font color="rgb(107, 142, 35)">Route 53の設定</font>

エイリアスのトグルボタンをONにして、トラフィックのルーティング先で下記のように選択しました。
* エンドポイントを選択：S3ウェブサイトエンドポイントへのエイリアス
* リージョンを選択：アジアパシフィック（東京）
* S3エンドポイントを入力：（作成したS3バケットを選択）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/fbc939d8-0892-0e5a-8827-3ecaecd822f4.png)


以上の設定完了後、ドメインへアクセスすると下記のようにファイルが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/b208093e-af60-d756-b51c-ec911ac29132.png)



# <font color="rgb(107, 142, 35)">構成②</font>

続いて、Route 53に登録したドメインを使って、ALB経由でWebサーバー(EC2)へのアクセスを確認しました。このときのALBへのアクセスがhttpsとなるようにACMでSSL/TLS証明書を発行しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/014a3f8d-21fe-c944-9c46-85c4cceba8da.png)


### <font color="rgb(107, 142, 35)">EC2の設定</font>

詳細は割愛しますが、EC2を起動して、Apacheをインストール、ドキュメントルートにindex.htmlを作成しました。

### <font color="rgb(107, 142, 35)">ACMの設定</font>

https通信を実施するためにACMでSSL/TLS証明書をリクエストしました。
完全修飾ドメインとして、`alb1.test.com`を指定し、検証方法としてDNS検証を選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/c4798618-204a-7111-292c-e25210a382a5.png)

リクエスト後、証明書のステータスが「保留中の検証」となりました。
Route 53でレコードを作成を選択し、レコードの作成を選択しました。

ドメインの所有権を確認するための検証用CNAMEレコードが作成され、数分経つと証明書のステータスが「発行済み」となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/34289ed4-2579-bdf9-c470-fabd7ad7211b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2926433/d2984a3e-88b4-ad93-351c-87c15f2be7bc.png)



https://repost.aws/ja/knowledge-center/route-53-validate-acm-certificates




### <font color="rgb(107, 142, 35)">ターゲットグループ、ALBの設定</font>


ターゲットグループの作成では、プロトコル：ポートを`HTTP：80`と指定しました。ヘルスチェックパスではドキュメントルートに配置したindex.htmlを指定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/d1b874d2-7415-5301-9c4b-39439143fbe0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/48a96ea9-e062-34cb-19a3-a595a348a5a5.png)


プライベートサブネットにあるEC2インスタンスにトラフィックを送れるように、ALBにはパブリックサブネットをマッピングしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/fccc8b66-f0ed-5c49-10be-fe33bac61502.png)

https://repost.aws/ja/knowledge-center/public-load-balancer-private-ec2


リスナーとルーティングでは、プロトコルとしてHTTPSを指定し、転送先として作成したターゲットグループを指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/2961e8a8-4b64-91ea-2f18-f91800718e58.png)





ALB作成時に、ACMで発行した証明書を指定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/f6a3bf64-1231-f74d-0e3d-6c1db1b70da5.png)


### <font color="rgb(107, 142, 35)">Route 53の設定</font>

ALBに対して`alb1.test.com`でアクセスできるようにエイリアスレコードを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/234b86df-c6d2-0906-f692-9e8c492c34f2.png)


`https://alb1.test.com/index.html`にアクセスすることで、下記のようにドキュメントルートに配置していたindex.htmlを表示させることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/e46c709f-98b4-85db-4dc9-e1fc07dd267a.png)



# <font color="rgb(107, 142, 35)">構成③</font>

最後にRoute 53に登録したドメインを使って、CloudFront経由で、S3やALB背後のWebサーバー(EC2)へのアクセスを確認しました。このときのCloudFront、ALBへのアクセスがhttpsとなるようにACMでSSL/TLS証明書を発行しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/9bacda1c-cc06-14e3-6bc2-17270e6305c9.png)


### <font color="rgb(107, 142, 35)">S3の設定</font>

オリジン用のS3バケットを作成し、index.htmlを配置しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/f0cb2ec9-dddf-9073-1e0b-4995be4eab58.png)



### <font color="rgb(107, 142, 35)">ACMの設定</font>

CloudFrontの場合、バージニアリージョンにおいて、`cloudfront1.test.com`を指定し、パブリック証明書をリクエストしました。（その後の流れはALBと同様に行いました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/edbe7104-ca78-e9ce-b4bc-f9a6a2d4ae1e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/bb9296e9-87f0-9b73-6b72-3fecc3c5f1ff.png)


### <font color="rgb(107, 142, 35)">CloudFrontの設定</font>

オリジンの設定では、Origin domainで作成したS3バケットを指定し、オリジンアクセスではOACを指定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/af6f6f29-c0a2-1eb5-0cec-669c004b4b58.png)

ディストリビューション作成後、OACによるアクセスを設定するためのバケットポリシーがコピーできたため、それをS3バケットのバケットポリシーに設定しました。


```json: OACによってCloudFrontからS3にアクセスすることを強制するバケットポリシー
{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipal",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "<S3バケットARN>/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::<アカウントID>:distribution/<ディストリビューションID>"
                }
            }
        }
    ]
}
```

代替ドメイン名で`cloudfront1.test.com`を設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/a0b5a559-119f-4ee5-7f97-21fbb91cd410.png)


:::note 
最初はこの設定をしていなかったため、この後のRoute 53でエイリアスレコード作成する際に、ディストリビューションの選択ができず、苦労しました。
:::

https://yohei-a.hatenablog.jp/entry/20210822/1629602941

続いて、オリジンにALBを追加しました。



オリジンの設定画面で、Origin domainとして`alb1.test.com`を設定しました。（プルダウンメニューが表示されますが、無視しました。）



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/f01dda93-9e86-e9fc-d182-9d3418626885.png)


:::note 
最初はプルダウンメニューから選択し、CloudFrontへアクセスしようとしましたが失敗しました。どうやらプルダウンメニューで表示されるドメインにSSL/TLS証明書が紐づいていないことによって起こるもののようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/74914057-5a6c-9313-eec5-438ad57622f8.png)
:::

https://zenn.dev/devcamp/articles/f488e3d22ff63e#%E3%81%AA%E3%81%9Chttps%E6%8E%A5%E7%B6%9A%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B


ビヘイビアの編集から、`/test/*`でアクセスした場合、CloudFrontからALBにリクエストを転送するように設定しました。（これに伴って、Webサーバー上のindex.htmlをtestフォルダ直下にコピーしました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/f79a475d-fce3-0582-5058-64ff29efcd01.png)



ALBへの直接のアクセスを防止するために、下記のようにカスタムヘッダーを追加しました。（ヘッダー名はわかりやすい名前にしました）
* ヘッダー名：`from-restriction-cloudfront`
* 値：（ランダムな文字列）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/ee98cd82-60ed-9801-7de9-1bdd0f32e0cd.png)

ALBでは、CloudFrontにより上記で設定したHTTPヘッダーが付与された場合、ターゲットグループに転送するルールを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/c62f484d-20a4-bba0-4797-db164b8736c3.png)

また、それ以外の場合、errorという固定メッセージを表示させるルールも追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/0c4430d9-5df9-3911-a3ee-2fbe4f3d7c55.png)




### <font color="rgb(107, 142, 35)">Route 53の設定</font>

CloudFrontに対して`cloudfront1.test.com`でアクセスできるようにエイリアスレコードを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/a53cf20e-8436-2756-57f9-756ae1bf70f2.png)

まず、cloudfrontからS3へのアクセスを確認しました。`https://cloudfront1.test.com/index.html`にアクセスするとS3バケットに格納したindex.htmlが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/d0dead97-7998-3102-1899-26ac3b8165d9.png)

続いて、ALBへ直接アクセスを試みました。`https://alb1.test.com/index.html`にアクセスすると、ルール設定どおりerrorページ（固定ページ）が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/ded050b0-c912-b14f-6c65-b4a9aada019f.png)


最後にcloudfrontからALB、Webサーバーへのアクセスを確認しました。`https://cloudfront1.test.com/test/index.html`にアクセスすると、ビヘイビアに設定した通り、Webサーバーのindex.htmlが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/36096d34-979d-c2cf-7bf3-b0d44e7e9a46.png)



# <font color="rgb(107, 142, 35)">終わりに</font>
ドメインの取得からRoute 53へのレコード登録や、CloudFrontディストリビューションの作成など、コンソール上であまりやったことのない作業を経験することができたため、机上よりも深く理解することができたと感じています。また、一連の作業の中で、はまりポイントのような箇所にも遭遇しましたが、解決することができたため、自信にもつながりました。今回特にCloudFrontについては、まだまだ詳しく知らない機能が多いなと感じたため、引き続きコンソール上で触りながら理解していきたいと考えています。



# <font color="rgb(107, 142, 35)">その他参考記事</font>

https://qiita.com/ponponpoko/items/a60dab676addeb040e9e

https://dev.classmethod.jp/articles/route53-domain-onamae/

https://qiita.com/takasho9321/items/e67c158391cb09bcc7dc

https://qiita.com/hyj624117615/items/450f6526c6a9c81848a6