今回はDNS方面の話題です。僕ははてなダイアリー以外にhttp://hnw.jp/という古めかしいサイトも管理しています。サイトの実体はGitHub Pagesで、これまでAWSのRoute 53でカスタムドメインの設定をしていました。
ところで、このサイトが2月の頭から1ヶ月ほど見えなくなっていました。原因は僕がGitHubからのメールを読み飛ばしており、DNS設定の変更を怠っていたためです。これに懲りて、今後DNS設定を二度といじらなくて済むようRoute 53からCloudFlareに引っ越してみました。その顛末を紹介します。
GitHub Pagesを普段使っていない人も多いと思いますので、まずは背景を紹介します。
GitHub PagesはGitHubの提供する機能の一つで、GitHub上の各リポジトリにhttp://hnw.github.io/hnw.jp/のようなURLを与え、Webサイトとしてアクセスできるようにするものです(URL中のhnwがGitHubユーザー名、hnw.jpがリポジトリ名です)。WebサーバもGitHubが提供してくれるので、gitの操作に慣れた人が静的コンテンツだけのサイトを手軽に作るにはもってこいのサービスだと言えるでしょう。
さらに、自分でドメインを持っていればGitHub PagesのURLを好きなホスト名に変更することもできます。「Setting up a custom domain with GitHub Pages」にも書いてある通り、リポジトリ上にホスト名を書いたファイルを追加した上でDNSのCNAMEレコードを設定すればカスタムドメインの設定ができます。
ただし、ホスト名として「zone apex」を使っている場合は設定方法が変わります。zone apexというのはドメイン名と同じホスト名のこと*1です。この場合RFCの制約から通常CNAMEを設定することができない*2ため、AレコードでGitHubのIPアドレスを直接指定するしかありません。
僕のサイトもzone apexだったため、Aレコードを設定していました。
今回GitHub PagesでIPアドレスの引っ越しがあり、僕がDNSの変更をサボっていたためにサイトが見えなくなっていたというわけです。
しかし、CNAMEで設定できていればIPアドレスの引っ越しはGitHub側のDNS設定だけで済むので、そもそも僕の作業は必要なかったはずです。zone apexでの運用を選ぶと今回のように手間が増える可能性がありますから、この事態が予見できていればwww.hnw.jpのようなホスト名をつけるという選択肢もあったかもしれません。
とはいえ、既に公開しているURLを今さら変更するわけにもいきません。そこでzone apexのままでCNAME的な設定ができないか調べてみたところ、DNSサービスのうち数社で実現できることがわかりました。それらのうち、今回はCloudFlareを試してみました。
CloudFlareは無料でも使えるCDNとして有名ですが、無料DNSサービスとして利用することもできます。このDNSでは「CNAME Flattening」機能が実装されています。
CNAME Flatteningの詳細は「CNAME Flattening: RFC-compliant support for CNAME at the root」にも書いてあるのですが、要するにzone apexに対するCNAMEを設定した場合、CNAMEのチェインをたどってAレコードとAAAAレコードとして提供するということです。
実際にCloudFlareのWebインターフェースからzone apexにCNAMEを設定してみると、CNAMEに対応するIPアドレスがTTL30秒のAレコードとして帰ってきました。
というわけでCloudFlareでGitHub PagesのCNAME設定をしてみます。僕の場合は下記のように今までAレコードでIPアドレスを指定していたのをCNAMEでの設定に変更しました。
zone apexでCNAME相当の設定をするのはGitHubが想定していない設定になりますが、仕組みを想像すれば動かない理由も無いはずです。実際この設定でサイトが閲覧できており、実験成功と言えるでしょう。これで安心して放置運用ができるというものですね。