Cloudflareで取得したドメインをRoute53 + ACMで管理する。

## はじめに
この記事は[AWS-GUILD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aws-guild-2023) 5日目の記事です。  
本記事では、Cloudflare Registersで取得したドメインをAWSのRoute53 + ACMで管理可能にしたやってみた系の記事になります。

## 構成
以下の順序で構成を作成します。
- Cloudflareでドメイン購入
- Route 53でドメイン管理
- ACMでサーバ証明書発行
- HTTPSでAPIGatewayにアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/5059eee2-f0b9-c0bb-cbb9-76a73e09d141.png)

## Cloudflareでドメイン購入
CloudflareではCDNサービスが有名ですが、ドメインレジストラとしても登録されています。  
ドメインは[ICANN](https://www.icann.org/)が管理しているのですが、通常のドメインレジストラはここからドメインを販売する場合、マージンを取って利益を出していたりします。  
ですが、Cloudflareはなんと**原価**でドメインを提供しています。  

以下のリンクからマイドメインをさくっと買っちゃいましょう。  
年間でランチ代程度です。
[Cloudflare](https://dash.cloudflare.com/)
私は、tessy.devというドメインを検証用に買いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/62f88df1-6ec2-34cc-e32e-afb062d6eb0c.png)

ドメインを購入するとCloudflareのネームサーバが割り当てられます。  
これをAWSのRoute53で管理する形になります。  
なお、本当はデフォルトネームサーバ自体をCloudflareからRoute53にしたかったのですが、デフォルトを変更するためには有料プランに入る必要があるため、今回はサブドメインの「aws.tessy.dev」をAWSに移管する形にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/e0db8f11-0b30-965b-406a-1664369e0ef1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/3d91ed93-c8bc-d7db-ba3d-8c39e115d7fb.png)

## Route 53でドメイン管理
Route 53のパブリックホストゾーンを「aws.tessy.dev」として作成します。
パブリックホストゾーンにすることでインターネットからのDNSクエリに反応することが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/8fe7a917-1c44-763f-b17a-49b9535d8dda.png)

ネームサーバーが発行されるため、これをCloudflare側に設定します。
TypeにNSレコード  
Nameに「aws」  
を設定し、Route 53で発行されたネームサーバーをそれぞれ設定してあげれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/5f0f777b-4bb9-fe65-7902-abdf5528ec50.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/91480c9f-520c-69ec-7570-d7f3122ece39.png)

## ACMでサーバ証明書発行
このままだと、HTTPSアクセスが難しいため、ACM（AWS Certificate Manager）でサーバ証明書を発行します。  
今回は「*.aws.tessy.dev」のとしてワイルドカードドメインとして設定します。  
これにより、「api.aws.tessy.dev」のような形でも証明書として機能できます。  
これで、色々なドメインが検証可能ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/0448efc2-420c-810e-fc3f-73bf980f80a5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/9c086a65-f310-b1f7-4649-8a06e70e1474.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/4fbf95bf-0bae-7e48-4839-763e22f20b08.png)

### Route 53でのドメイン検証
Route 53で管理されていることをDNS検証するため、CNAMEレコードを設定します。  
先ほど、ACMでドメインを登録した際に、CNAMEレコードが発行されているため、これをRoute 53に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/fc51fab7-2881-ccb2-9510-1b645e6e60e4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/87f3d14a-d3e6-2769-4f60-f78f9b412ac9.png)

ここまで設定すると、ACM側でドメインが検証されて、ステータスが成功となります。　　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/19d56e92-08ab-3a91-9536-d932c0410394.png)

## HTTPSでアクセス
ここまで来るとRoute 53 + ACMで管理する準備ができました。  
最後にAPI GatewayでHTTPS接続してアクセスしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/06aaaa84-a794-9b8b-885b-1cb058428815.png)

API Gatewayのカスタムドメインとして「api.aws.tessy.dev」を設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/ce5c5309-a277-bcb2-77d9-e852f683434d.png)

また、Route 53にもAPI Gatewayのドメインを指すように、Aレコードを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/d7878b37-92ce-5ed3-9783-6d571fdf5d40.png)

この状態で、HTTPSでアクセスすると、以下の通り、ワイルドカードドメインで登録され、アクセス可能であることが確認出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/22dc9048-0f35-9323-84db-a48e8962db41.png)

## 終わりに
Cloudflareで取得したドメインをAWSで管理可能にしてみました。
思ったことは
　　**マイドメイン**
は良いです！
年間で見てもランチ１回分くらいで検証用のドメインを購入できます。

HTTPでのアクセスも勉強になりますが、HTTPSを利用するとサーバ証明書、の知識もついてより勉強になります。
何より達成感が違いますので、皆さんもチャレンジしてみてください。

## 付録
ドメイン検証をTerraformで自動で行う場合の参考です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58256/adb16a80-d0a2-6ab0-1054-2cffea468a79.png)