VPC内の名前解決をbindからRoute53のPrivate DNSへ移行してみる

AWSのVPC内で使われている内部の名前解決をbindからRoute53のPrivate DNS対応への移行をする必要があったのですが、やったことがなかったので試してみた時の作業メモ。

# 準備

CloudFormationでVPC空間を別で作っておく

以前の記事のものを利用。

[VPC S3エンドポイントを使ってプライベートサブネットからS3へ接続する](http://qiita.com/toshihirock/items/2ba42aed00a3331b8e7d)

# bindで名前解決してみる

+ [EC2上で内部向けDNSを構築してみる](http://qiita.com/mechamogera/items/574de60310fb19e088ca)

新規にEC2を起動します。
なお、本EC2に設定するSecurityGroupのInboundでDNS(UDP)とDNS(TCP)の接続許可を行う設定にして下さい。

httpdインストール、確認

```
$ sudo yum update -y
$ sudo yum install httpd -y
$ echo "hogeee" | sudo tee /var/www/html/index.html
$ sudo service httpd start
$ sudo chkconfig httpd on
$ curl http://localhost
hogeee
```

bindインストールをし、設定を行います。

```
$sudo yum install bind -y
$sudo cp /etc/named.conf /etc/named.conf.org
```

`named.conf`を編集します。
**172.31.22.115** の部分は自身のEC2プライベートIPに置き換えてください。

```lang:/etc/named.conf
options {
- listen-on port 53 { 127.0.0.1; };
+ listen-on port 53 { 127.0.0.1; 172.31.22.115};

- allow-query     { localhost; };
+ allow-query     { any; };

+ forwarders {  8.8.8.8; 8.8.4.4; };
+ forward only;
};

+ zone "example.com" IN {
+  type master;
+  file "master.example.com";
+ };
```

次に上記から参照する`master.example.com`を作成します。

```lang:/var/named/master.example.com
$TTL 43200
example.com.     IN      SOA    help.example.com. ns01.example.com. (
                            1 ; serial
                            21600      ; refresh (6 hours)
                            7200       ; retry (2 hours)
                            1209600    ; expire (2 weeks)
                            43200)      ; minimum (12 hours)

example.com.            NS      ns01.example.com.
ns01                    A       [EC2インスタンスのPrivateIP]
www                    A       [EC2インスタンスのPublicIP]
```

bindサーバーを起動します。

```bash
$sudo service named start
```

resolve.confを変更し、ローカルホストのbindを参照するようにします。

```bash
$sudo cp /etc/resolv.conf /etc/resolv.conf.org
```

```lang:/etc/resolve.conf
search ap-northeast-1.compute.internal
nameserver 127.0.0.1
```
resolve.confが再起動時に勝手に書き換わらないようにするために`PEERDNS=yes`を`PEERDNS=no`に変更します

[Amazon EC2(Linux)のネットワーク設定でハマったときに見るメモ](http://dev.classmethod.jp/cloud/ec2-linux-network-conf-tips/)

```bash
$sudo sed -i 's/PEERDNS=yes/PEERDNS=NO/g' /etc/sysconfig/network-scripts/ifcfg-eth0
```

名前解決出来るか確認します。

```bash
$host ns01.example.com
ns01.example.com has address 172.31.18.72

$ curl http://www.example.com
hogeee
```

# 他のEC2からの確認

新規にEC2を起動します。
sshログイン後、以下の対応を行います。

resolve.confの設定。

```bash
$sudo cp /etc/resolv.conf /etc/resolv.conf.org
```

```lang:/etc/resolve.conf
search ap-northeast-1.compute.internal
nameserver {bindを設定したサーバーのprivate ip}
```

resolve.confが自動で変わらないようにする。

```bash
$sudo sed -i 's/PEERDNS=yes/PEERDNS=NO/g' /etc/sysconfig/network-scripts/ifcfg-eth0
```

確認。

```bash
$host www.example.com
www.example.com has address 54.64.244.146

$url http://www.example.com
hogeee
```

問題なければ、bindが入っていないサーバーはterminateします。

bindが入っているサーバーでは以下を行います。

+ bindサービスの停止
+ resolve.confとifcfg-eth0の設定を元に戻す

# bindの情報をRoute53に手動で移行する

[Route53編～Private DNS～](http://recipe.kc-cloud.jp/archives/7545)

Route53でHostedZonesを新規に作成します。

+ DomainName->example.com
+ Type->PrivateHostedZone for Amzon VPC
+ VPC ID->CloudFormationで作成したVPC

次にAレコードを追加します。

+ Name->www.example.com
+ Type->IPv4 address
+ Value->{httpdサーバーのプライベートIP}

VPCでDHCP options setを作成します。ap-northeast-1.compute.internalとexample.comとの間のスペースに注意。

+ Domain name->ap-northeast-1.compute.internal example.com
+ Domain name servers->AmazonProvidedDNS

作成したDHCP options setをVPCに設定します。

また、VPCで以下が設定されているか確認します。

+ DNS resolution=yes
+ DNS hostname=yes

EC2(httpd)をrebootし、sshログインし、`resolve.conf`の内容を確認します。

```/etc/resolve.conf
; generated by /sbin/dhclient-script
search ap-northeast-1.compute.internal example.com
nameserver 10.1.0.2
```

Route53を使って名前解決ができるか確認します。

```bash
$host www.example.com
www.example.com has address 10.1.11.189

$curl www.example.com
hogeee
```

名前が引けてWebサイトも確認できます。

# import機能を使ってBindからRoute53へ移行する

[Amazon Route 53(DNSサービス)にBINDゾーンファイルをインポートする](http://dev.classmethod.jp/etc/route53-import-zone-file/)

Aレコードが数件であれば、手動で良いのですが、件数が多い場合に大変です。

上記に対応できるようにbindの設定ファイルを取り込めるようになっているのでその機能を使ってみます。

なお、SOAとNSレコードは対応外のようです（importの際にあっても良いが無視される）

ます、先ほど登録したRoute53のAレコードを削除します。

次にEC2にsshログインし、名前解決出来ないことを確認します。

```bash
$curl http://www.example.com
curl: (6) Could not resolve host: www.example.com
```

次に先ほどbindを立てたサーバーの`/var/named/master.example.com`の内容をコピーします。

なお

```master.example.com
ns01                    A       {Private IP}
```

という部分はbindのホスト名だったのですが、今回は不要となるのでこの行は削除します。

上記コピーしたものを　**Import Zone File** ボタンを押下してインポートします。


完了するとAレコードが1件追加されているのが確認できます。

このあとEC2上で`nslookup www.example.com`で名前引き出来るかやってみましたが、うまいきませんでした。。。ただし、rebootしてからだとうまくできました。(あんまり詳しくないのですが、LinuxはクライアントでDNSのキャッシュをしないのですぐに反映されると思ったのですが）試してませんが、ネットワーク再起動などでもできたのかもしれません。

```bash
$curl http://www.example.com
hoge
```