(2015年までの)odaillyjp blog

イベント参加記録とプログラミング系の雑記

PointDNSでHerokuアプリにNaked domainを割り当てる

HerokuアプリにNaked domain(www無しのドメイン)を割り当てる方法は色々あります。あるアプリで「PointDNS」というHerokuのアドオンを利用してNaked domainを割り当ててみました。とても簡単に割り当てることができましたので、設定方法のメモと、名前解決にまつわるよちよち向けな話をブログに残しておきます。

PointDNS | Add-ons | Heroku

PointDNSの特徴

簡単にですが、PointDNSの特徴を書きます。

  • Herokuのアドオンとして提供
  • 1アプリ毎で1ドメインにつき10レコードまで無料で登録できる
  • Herokuアプリで必要となるレコードをまとめて登録できる機能がある
  • 管理画面からドメインのリクエスト数を確認することができる

1アプリ毎に無料で使えるところがとても魅了的です。1ドメインにつき10レコードまで登録できますが、NSレコードとSOAレコードのために6レコードが最初から登録されていますので、無料で自由に使えるのは4レコードまでだと思ってください。(もしかしたら、一部のNSレコードを削る方法があるかもしれません。)

Naked domainを割り当てるまでの手順

下記のものが必要になりますので、事前に用意しておいてください。

  • Herokuアカウント(クレジット情報を入力して、アドオンが利用できる状態にしておくこと)
  • Herokuアプリ
  • ドメイン(好みのレジストラからドメインを登録しておくこと)

アドオンを導入する

アドオンはHerokuコマンドを使って導入できます。(PointDNSのページから導入する方法もあります。)

$ heroku addons:add pointdns --app アプリ名

ドメインを設定する

Herokuアプリの管理画面上にPointDNSアドオンが追加されていますので、PointDNSのリンクをクリックして、PointDNSの管理画面に入ります。

f:id:Shindo_Masaya:20150121204403j:plain:w500

右上に見える「Domain name」のフォームにドメイン名(Naked domain)を入力して、「Add」ボタンを押します。その後、ドメインごとの管理画面に移動しますので、「1-click integrations」ボタン(下の写真の赤枠で囲んだボタン)を押します。

f:id:Shindo_Masaya:20150121210918j:plain:w500

モーダルウィンドウが表示されますので、Herokuのフォームに自分のHerokuアプリ名を入力して、「Add」ボタンを押します。

f:id:Shindo_Masaya:20150121212155j:plain:w300

下の写真のように、ALIASレコードとCNAMEレコードが自動的に追加されます。これでPointDNS側の設定は完了です。とても簡単でした!ところで、自動的に追加されたレコードを見て「CNAMEは知っているけど、ALIASは初めて見たよ。何これ?」と疑問を持つ方がいると思います。はっきりとした答えは見つかりませんでしたが、調べてみましたので、気になる方は「おまけ」の項目をご覧ください。

f:id:Shindo_Masaya:20150121212756j:plain:w400

後はレジストラドメイン登録業者)のサービスで、ドメインにPointDNSのネームサーバーを登録すれば、ドメインの設定は完了です。しばらく時間をおいてから、Naked domainでHerokuアプリにアクセスできるか確認してみましょう。

以上でHerokuアプリにNaked domainを割り当てる手順の説明は終わりです。

【よちよち向け】ドメイン名から目的のサーバーを見つけるまでの流れ

ネットワークについてあまり詳しくなくても「DNSという仕組みを利用して、ドメイン名から目的のサーバーのIPアドレスを探し出す」という漠然とした知識をお持ちの方は多いと思います。良い機会ですので、ドメイン名から目的のサーバーを見つけるまでの流れについて入門者レベルでまとめます。

サンプルストーリーがあった方が想像しやすいかと思いますので、私が作成した「ことばの探索機」というサービスのドメイン名である「kototan.info」にクライアントがアクセスするときの流れを例にします。

クライアントが「kototan.info」というドメイン名にアクセスするとき、まずは、「キャッシュDNSサーバー」というサーバーに対してドメインの情報を尋ねにいきます。キャッシュDNSサーバーは、ドメイン情報を調査するときの窓口になったり、過去に調査したドメインの情報をキャッシュを行ってくれます。「kototan.info」ドメインのキャッシュが残っていれば、それをクライアントに教えくれるだけで目的のサーバーが判明するのですが、今回はキャッシュが無かったことを想定して話を続けます。

キャッシュDNSサーバーにキャッシュが無かった場合、「ルートサーバー」というサーバーに対してドメインの情報を尋ねにいきます。ルートサーバーはドメイン名をドットで分割した際の最後の項目のドメイン情報を管理しています。ちなみに、この項目をトップレベルドメインTLD)」と呼びます。「kototan.info」ドメインの場合は「.info」がTLDになります。ルートサーバーはドメインの情報を尋ねられると、対象のTLDを管理している機関の情報を教えてくれます。ちなみに、この機関のことをレジストリと呼びます。

次に、キャッシュDNSサーバーはレジストリに対して「kototan.info」ドメインの情報を尋ねにいきます。お名前.comなどのレジストラ「『kototan.info』というドメインは『dns11.pointhq.com』というネームサーバーを利用しています」といった情報をレジストリのデータベースに登録しているはずですので、レジストリに「kototan.info」ドメインの情報を尋ねると、そのドメインに登録されているネームサーバーを教えてもらうことができます。

f:id:Shindo_Masaya:20150201224703j:plain:w500

ターミナルではdigコマンドを使うことで、ドメインに登録されているネームサーバーを知ることができます。

$ dig kototan.info. ns

; <<>> DiG 9.8.3-P1 <<>> kototan.info. ns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17770
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;kototan.info.			IN	NS

;; ANSWER SECTION:
kototan.info.		3600	IN	NS	dns11.pointhq.com.
kototan.info.		3600	IN	NS	dns10.pointhq.com.
kototan.info.		3600	IN	NS	dns8.pointhq.com.
kototan.info.		3600	IN	NS	dns4.pointhq.com.
kototan.info.		3600	IN	NS	dns9.pointhq.com.

;; Query time: 131 msec
;; SERVER: 220.220.248.1#53(220.220.248.1)
;; WHEN: Sun Feb  1 16:21:10 2015
;; MSG SIZE  rcvd: 138

ネームサーバーが分かったら、キャッシュDNSサーバーはそのネームサーバーに対して「kototan.info」の情報を尋ねにいきます。ネームサーバーは各DNSサービスの設定画面で登録した通りの情報を返します。今回のケースでは、PointDNSの設定画面で「『kototan.info』は『kototan.herokuapp.com』というドメインと同じIPアドレスです」という情報を登録しましたので、ネームサーバーに「kototan.info」の情報を尋ねると、「kototan.herokuapp.com」というドメインIPアドレスを教えてもらうことができます。このように、ドメイン名からIPアドレスを見つけることを「名前解決」と呼びます。

ターミナルではhostコマンドを使うことで、名前解決を行うことができます。

$ host kototan.info dns11.pointhq.com
Using domain server:
Name: dns11.pointhq.com
Address: 119.81.97.170#53
Aliases:

kototan.info has address 54.243.85.192

目的のサーバーのIPアドレスを知ることができました。最後に、キャッシュDNSサーバーはこの情報をクライアントに返してあげます。このような方法でドメイン名から目的のサーバーを探し出していたのですね。

【おまけ】ALIASレコードとは

wikipediaDNSレコードタイプを調べても、ALIASというレコードタイプは見つかりません。alias(別名)と聞くと、CNAMEレコードのことが思い浮かびますが、ALIASレコードとは何なのでしょうか。ALIASレコードで登録した「kototan.info」と、CNAMEレコードで登録した「www.kototan.info」に対して、名前解決を行ってみます。

PointDNSで設定したレコード

f:id:Shindo_Masaya:20150201225254j:plain:w500

ALIASレコードに対しての名前解決

$ host kototan.info
kototan.info has address 54.243.85.192

CNAMEレコードに対しての名前解決

$ host www.kototan.info
www.kototan.info is an alias for kototan.herokuapp.com.
kototan.herokuapp.com is an alias for us-east-1-a.route.herokuapp.com.
us-east-1-a.route.herokuapp.com has address 23.23.170.22

CNAMEレコードとは違い、ALIASレコードはIPアドレスが一回で返ってきています。挙動はAレコードに似ていますね。気になります。この後、PointDNSのドキュメントを読んでみたのですが、探し方が良くないせいか、ALIASレコードの説明を見つけることができませんでした。

さらに色々と調べたところ、Amazon Route 53にもALIASレコードは存在するそうで、それについて説明されているブログが見つかりました。

Amazon Route 53のALIASレコード利用のススメ | Developers.IO

一言でまとめると、Amazon Route 53のALIASレコードとは「ALIAS先のドメインに名前解決を行い、そこで判明したIPアドレスを使って、Aレコードとして登録する」という独自拡張のレコードタイプなようです。PointDNSのALIASレコードがAmazon Route 53と同じ仕様かはわかりませんが、挙動だけを見るとそれに近い気がします。

もしAmazon Route 53と同じ仕様であれば、Naked domainにはCNAMEレコードよりALIASレコードを利用したほうが良さそうですね。