Azure DNSを利用してレコード更新を自動化する

#はじめに
2016年9月にAzure DNSがGAしました。
その記念というわけではありませんが、Value Domainで管理していたドメイン名をAzure DNS管理に変更してみます。
更にDNSレコードをPowershellから更新するノウハウも載せます。

#DNSゾーンの作成
今回は私が個人的に10年くらい温めているけど全然使っていないドメイン名「nya-n.net」を使います。
Azureポータルから「＋」「ネットワーキング」「DNSゾーン」を選び、「作成」を押します。

![image](https://qiita-image-store.s3.amazonaws.com/0/137436/c66a40d5-1168-d9b9-f321-c6c42c354ced.png)


DNSゾーンの作成ブレードでは、名前欄にAzure DNSで管理を始めるドメイン名、リソースグループ名、リソースグループの場所は適当に入力します。
リソースグループの場所を東日本などに設定しても、Azure DNSのサービスそのものはGlobal展開されるのでご安心を。
最後に「作成」を押してデプロイ開始です。
![image](https://qiita-image-store.s3.amazonaws.com/0/137436/4361016e-da9c-f6bb-03e6-07429722f3f6.png)

しばらく待つとDNSゾーンというリソースが作成されます。
概要を確認すると、最初にNSレコードとSOAレコードだけが作成されています。
ネームサーバとして4つのFQDNが表示されていますので、こちらの内容をメモします。

#レコードセットの追加
レコードセットとはAレコードとかCNAMEレコードとかの事です。
既存のネームサーバー(今回でいうとvalue domain)に登録されていた各種レコードは自動では移行されないため、とりあえず今回は必要に応じて手動で追加する方法を紹介します。

DNSゾーンの概要ブレードから「＋レコードセット」をクリックします。
レコードセットの追加ブレードにて、内容を入力します。
名前欄はドメイン名を除いた先頭部分を指定します(www等)
種類は適宜適切なものを指定します。
TTLも任意の値を。頻繁にIPアドレスが変更になるレコードとかはこちらの値をあまり長くしないほうが良いですね。
最後の入力項目は登録するレコードの種類によって異なりますので、適切な値を入力します。
最後に「OK」を押してレコードセットの追加を完了します。

![image](https://qiita-image-store.s3.amazonaws.com/0/137436/a4a3784b-f47b-45b7-441f-adf7f72fe425.png)


#ドメインのネームサーバ変更
レジストラで管理してもらっているドメイン名に指定されているネームサーバをAzure DNSで割り当てられたものに変更します。
今回はドメイン名はvalue domainで管理しているため、以下の内容になっています。

```
$ nslookup -type=ns nya-n.net
Server:         192.168.XXX.XXX
Address:        192.168.XXX.XXX#53

Non-authoritative answer:
nya-n.net       nameserver = NS1.VALUE-DOMAIN.COM.
nya-n.net       nameserver = NS2.VALUE-DOMAIN.COM.
nya-n.net       nameserver = NS3.VALUE-DOMAIN.COM.
nya-n.net       nameserver = NS4.VALUE-DOMAIN.COM.
nya-n.net       nameserver = NS5.VALUE-DOMAIN.COM.

Authoritative answers can be found from:
```

こちらを変更するために、valude domainのコントロールパネルに管理者でログインします。
「ドメイン」「ドメインの設定操作」で表示されたドメイン一覧から該当のドメイン名の「ネームサーバー」ボタンをクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/137436/ac9f22e5-b303-a1f4-fa82-093f1655ed52.png)

ネームサーバー1から4の内容を先程Azure DNSのゾーン作成時に表示されたネームサーバーの内容に書き換えて、「保存する」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/137436/7b3b60ff-c114-19a2-4b77-3e80215977a2.png)

しばらく待ってから確認するとNSレコードが更新されます。

```
$ nslookup -type=ns nya-n.net
Server:         192.168.XXX.1
Address:        192.168.XXX.1#53

Non-authoritative answer:
nya-n.net       nameserver = ns1-08.azure-dns.com.
nya-n.net       nameserver = ns3-08.azure-dns.org.
nya-n.net       nameserver = ns4-08.azure-dns.info.
nya-n.net       nameserver = ns2-08.azure-dns.net.

Authoritative answers can be found from:
```

#Powershellからのレコードセット追加
Powershellからのレコードセットの追加は以下の感じで行います。

1行目でホスト名「myhome」をAレコードで作成します。TTLは300秒です。
2行目でそのmyhomeに対して、IPv4のアドレスとして「8.8.8.8」を指定しています。
3行目で設定した内容をコミットします。

```ps1
$rs = New-AzureRmDnsRecordSet -Name myhome -RecordType A -Ttl 300 -ZoneName nya-n.net -ResourceGroupName TESTDNSRG
Add-AzureRmDnsRecordConfig -RecordSet $rs -Ipv4Address 8.8.8.8
Set-AzureRmDnsRecordSet -RecordSet $rs
```

Azureポータル上からは「最新の情報に更新」をクリックすると、登録したレコードセットの内容が反映されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/137436/a3107a6e-9837-b252-7f84-c2f51a44dba0.png)

nslookupでもちゃんと名前解決ができるようになりました。

```
$ nslookup -type=a myhome.nya-n.net
Server:         192.168.XXX.XXX
Address:        192.168.XXX.XXX#53

Non-authoritative answer:
Name:   myhome.nya-n.net
Address: 8.8.8.8
```

#Powershellからのレコード更新
自宅でインターネットを利用している際に、「WAN側のIPアドレス(グローバルIPアドレス)が非固定なんだけど、自宅にサーバを置きたいな！」という欲求は皆さん感じていると思います。
(いや、ないか)

その場合でも以下に示すPowershellスクリプトを工夫して、WAN側のIPアドレスが変更時にこちらのスクリプトを実行すれば、DNSレコードの更新を自動化することも出来るかもしれません。

1行目では既に作成ずみのDNSレコードセットの情報を取得します
2行目では直接配列内に入っているIPv4アドレスを新たな内容に書き換えます
3行目で設定した内容をコミットします

```ps1
$rs2 = Get-AzureRmDnsRecordSet -Name myhome -ResourceGroupName TESTDNSRG -ZoneName nya-n.net -RecordType A
$rs2.Records[0].Ipv4Address = '8.8.4.4'
Set-AzureRmDnsRecordSet -RecordSet $rs2
```

TTLで300秒を指定しているので最低5分は待ってから再度nslookupすると内容が書き換わったことがわかります。

```
$ nslookup -type=a myhome.nya-n.net
Server:         192.168.XXX.XXX
Address:        192.168.XXX.XXX#53

Non-authoritative answer:
Name:   myhome.nya-n.net
Address: 8.8.4.4
```

もちろんAzureポータル上も値が更新されています。
![image](https://qiita-image-store.s3.amazonaws.com/0/137436/6e8052ae-7f45-31ac-51a7-efe87474de81.png)

#おわりに
Azure DNSは無論エンタープライズ用途で使えるだけのスペックを兼ね備えているサービスになりますが、個人用途の場合は安価で利用可能です。
[価格 - DNS](https://azure.microsoft.com/ja-jp/pricing/details/dns/)のページを見ればわかりますが、月々100円～程度で利用可能です。
それでいて、Powershellなどを組み合わせればレコード管理を自動化する事もできるため、色々捗るのではないかと思います。