お名前.comのドメインをAWSで使用する4つの方法


# はじめに

以前、お名前.comで購入したドメインがあって、そのドメインをどうにかしてAWS（特にELB）で使用したいと思い、いろいろ調べたのでその結果を書きます。

![Domain-name.jpg](https://qiita-image-store.s3.amazonaws.com/0/55672/49096d07-8231-6f88-b7ff-9fc8d6cbd883.jpeg)


# Agenda

1. [お名前.comのドメインをRoute53に移管する](#1お名前comのドメインをroute53に移管する)
2. [お名前.comにRoute53のDNSを登録してサブドメインを委任する](#2お名前comにroute53のdnsを登録してサブドメインを委任する
)
3. [お名前.comのレコードに直接AWSサービスのFQDNをCNAMEで設定する](#3お名前comのレコードに直接awsサービスのfqdnをcnameで設定する)
4. [Route53でドメインを購入し、お名前.comのドメインからCNAMEで参照する](#4route53でドメインを購入しお名前comのドメインからcnameで参照する)

# 前提条件

- お名前.comでドメイン取得済み
- AWSアカウント作成済み

# 1.お名前.comのドメインをRoute53に移管する

ドメインをRoute53に移管するには以下の制約をクリアしなくてはいけない。

1. お名前.comで購入したドメインが購入から60日以上経過していること
2. 移管対象のドメインが[Route53に登録できるドメイン](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/registrar-tld-list.html)であること

## お名前.comでの設定

- `ドメイン設定` -> `ドメイン移管ロック`の状態を`未設定`にする
- `Navi TOP`で対象のドメインをクリックし、`ドメイン詳細`の画面で`AuthCode`をメモる
- 同じく`ドメインの詳細`画面で`ドメイン情報（Whois情報）`を編集する

## Route53での設定

- 移行するドメイン名で`Hosted Zone`の作成
- 以下のように`Transfer Domain`で移管対象のドメインを入力し、移管可能か調べる
 - ![route3.png](https://qiita-image-store.s3.amazonaws.com/0/55672/544914c1-1b1a-ada7-91ac-fc3220d8c8d2.png "route3.png")
- 以下のように`AuthCode`を入力し、キャプチャのように設定する
 - ![route4.png](https://qiita-image-store.s3.amazonaws.com/0/55672/a40c3908-d8e2-11f2-c546-c854e713e721.png "route4.png")
- Whois情報を確認し、`購入`する
- `Pending requests`にドメインが登録されていればOK

## メール承認

- しばらくするとwhoisに登録したメールアドレスにメールが届くので、承認する

## 完了待ち

- 全ての移管が完了するまでに数日かかる。

> 続いて、現在のレジストラと協力して、ドメインの移管作業が開始されます。
現在のレジストラが移管リクエストに応答しない場合（これはレジストラではよくあることです）、移管は 5～7 日後に自動的に実行されます。
現在のレジストラが何らかの理由で移管リクエストを拒否した場合は、現在のレジストラに連絡して移管に関する問題を解決できるように、登録者にメールが送信されます。

ということですので、気長に待ちます。

# 2.お名前.comにRoute53のDNSを登録してサブドメインを委任する

## Route53設定

- Route53でHostedZonesを作成する
- 作成後以下のように`NSレコード`と`SOAレコード`が作成される
 - ![route1.png](https://qiita-image-store.s3.amazonaws.com/0/55672/ecb665f7-54f0-4b3b-1e4f-d03ff708dc96.png "route1.png")
- このうち、`NSレコード`4つを後に使うのでメモをしておく
- 以下のようにAWSサービスをレコードに追加（今回は`ELB`を`ALIAS`で追加）
 - ![route2.png](https://qiita-image-store.s3.amazonaws.com/0/55672/6df33393-c203-9816-a0a8-cc331082a49e.png "route2.png")


## お名前.comの設定

- `ドメイン設定`->`DNS関連機能の設定`に進む
 - ![onamae1.png](https://qiita-image-store.s3.amazonaws.com/0/55672/44d03242-fcbc-2a8e-2431-271560643bc2.png "onamae1.png")
- 該当ドメインを選択して`次へ進む`を押下
- 以下のように、`DNSレコードを利用する`の横にある`設定する`を押下
 - ![onamae2.png](https://qiita-image-store.s3.amazonaws.com/0/55672/c97c7106-1ad2-13ff-ed81-8dbd109305fb.png "onamae2.png")
- 以下のように`Route53`の`NSレコード`を4つ登録し、下にある`確認画面へ進む`を押し、確定させる。
 - ![onamae4.png](https://qiita-image-store.s3.amazonaws.com/0/55672/1f258a0f-a11b-b093-b9a0-4f61a9b188a3.png "onamae4.png")


## 設定確認

- NSレコード確認（反映までに時間が掛かる）

```bash:console
$ dig NS sub1.sadayukimatsuno.com

; <<>> DiG 9.8.3-P1 <<>> NS sub1.sadayukimatsuno.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7626
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;sub1.sadayukimatsuno.com.	IN	NS

;; ANSWER SECTION:
sub1.sadayukimatsuno.com. 894	IN	NS	ns-433.awsdns-54.com.
sub1.sadayukimatsuno.com. 894	IN	NS	ns-1778.awsdns-30.co.uk.
sub1.sadayukimatsuno.com. 894	IN	NS	ns-781.awsdns-33.net.
sub1.sadayukimatsuno.com. 894	IN	NS	ns-1151.awsdns-15.org.

;; Query time: 50 msec
;; SERVER: 192.168.13.1#53(192.168.13.1)
;; WHEN: Fri Feb 19 14:10:59 2016
;; MSG SIZE  rcvd: 179
```

- `http://sub1.sadayukimatsuno.com/`にアクセス

## ELBにおけるHTTPSの設定

- 証明書取得（`let's encrypt`でやる場合はこちらを[参考](http://qiita.com/sadayuki-matsuno/items/afbd960198bd0ae1101f)に）
- ELBに配置
- `https://sub1.sadayukimatsuno.com`にアクセスできるようになる。

## 注意点

- ELBの証明書登録時に証明書の名前として「-」を使わない
- お名前.com側のFQDNとRoute53側のFQDNは一致させる
- 複数のサブドメインを委任して、全ての向き先が同一の`ELB`だとしてもきちんと動作する

## 追加検証

### 複数のドメインからのHTTPSアクセスをELBを通して1つのインスタンスに向けられるか。

回答：頑張れば可能

`ELB`には1つのSSL証明書しか載せることはできないので、`ELB`1つだと無理。
したがって、ドメイン分`ELB`を用意して、全ての`ELB` の向き先を1つのインスタンスにする。なお、コンソールでは1つのインスタンスに複数の`ELB`を設定できないため、APIを使用して設定する必要がある。

[参考文献](https://web.archive.org/web/20130914191613/http://elwoodicious.com/2009/12/23/using-elb-to-serve-multiple-domains-over-ssl-on-ec2-for-giggles/)


### 複数のサブドメインからのHTTPSアクセスをELBを通して1つのインスタンスに向けられるか。

回答： 可能(難易度は証明書の数次第)

ワイルドカード証明書があれば、1台の`ELB`で大丈夫なので、特に問題なく使えるだろう。

let's encryptなどでFQDN単位で証明書作ったら、その数だけ`ELB`が必要になってしまう。

# 3.お名前.comのレコードに直接AWSサービスのFQDNをCNAMEで設定する

## お名前.comの設定

- 以下のように`CNAME`レコードを追加する
 - ![onamae5.png](https://qiita-image-store.s3.amazonaws.com/0/55672/6ffd3ba4-91bc-32a9-1193-d518099f7302.png "onamae5.png")


## 設定確認

- CNAMEレコード確認（反映までに時間が掛かる）

```bash:console
$ dig CNAME sub1.sadayukimatsuno.com

; <<>> DiG 9.9.5-3ubuntu0.6-Ubuntu <<>> CNAME sub1.sadayukimatsuno.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13634
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sub1.sadayukimatsuno.com.	IN	CNAME

;; ANSWER SECTION:
sub1.sadayukimatsuno.com. 3594	IN	CNAME	matsuno-test-1586476005.ap-northeast-1.elb.amazonaws.com.

;; Query time: 1 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Fri Feb 19 07:30:52 UTC 2016
;; MSG SIZE  rcvd: 120
```

これが一番簡単ではある。
サブドメインのサブドメインとか管理しようと思ったら大変だけど。

# 4.Route53でドメインを購入し、お名前.comのドメインからCNAMEで参照する

## Route53での設定

上の方で幾つかすでに基本的な設定方法についてはキャプチャを使って説明したので、ここからは、キャプチャの頻度を下げます。

- Route53でドメイン購入 `Route53` -> `Registerd domains` -> `Register Domain`
- 購入後、作成された`Hosted Zone`の任意のサブドメインで`ELB`への`ALIAS`レコードを作成

## お名前.comでの設定

- DNSレコード設定で、`CNAME`を先ほど作成したサブドメインに向けるレコードを追加


## 注意点

- `CNAME`は他のレコードと共存できないため、ドメインのトップ階層(Zone Apex)に設定できない。（Zone ApexにはNSレコードが設定されているはずだから） - [参考情報](http://tools.ietf.org/html/rfc1912#section-2.4)

## 追加検証

先ほどの`3. お名前.comのレコードに直接AWSサービスのFQDNをCNAMEで設定する`というものと、`4. Route53でドメインを購入し、お名前.comのドメインからCNAMEで参照する`というものの違い

- 3のメリット
 - ドメイン購入費用がかからない
 - Route53を利用しなくてよい
- 4のメリット
 - ALIASレコードが使える（ALIASとCNAMEの比較は[こちら](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html)）
 - 一つの`Hosted Zone`で複数のドメインを受けることができる（しかしHTTPSの場合は`ELB`を分けなくてはいけないので、適当なサブドメインを切って、レコードセットを分ける必要がある）
 - ELBの変更時にAWS内の設定変更のみで完結する（`ELB` and `Route53`）
 
 この比較は時と場合による気がしている。
 というよりも管理するなら、`2. お名前.comにRoute53のDNSを登録してサブドメインを委任する`というやり方がやっぱりいい。
 
 # 最後に

様々な環境でいろんな制約がある中でベストな方法を選択する必要があると思います。
他にも、「こんな方法でやったほうがこんな時おいしいよ！」みたいな意見があれば、教えて下さい。