Herokuでネイキッドドメイン(ルートドメイン)を利用する方法

要約(書いてたらやたら長くなったので)

Herokuではネイキッドドメイン(ルートドメイン)使えないので、使えるようにするツール作りました。
IP-Updater-For-Heroku

利用にはDozensのアカウント(基本無料)が必要です。

Herokuで設定されるデフォルトURLは嫌だ

Heroku上でアプリケーションを作成すると、下記のようなドメインが与えられます。 例)hogeapp.herokuapp.com
hogeapppの部分は自分で決めたアプリ名が入る。
せっかくサービス作ったんだか、独自ドメインを付けたくなるのが人情ですよね。

Herokuではネイキッドドメインを使えない

Herokuではカスタムドメインを設定可能ですが、ネイキッドドメインを使うことができない

お名前ドットコムとかムームードメインあたりでドメイン取得して設定するだけです。
ただし、Herokuではネイキッドドメイン(ルートドメイン)の利用はサポートされていません。

Zone apex domains (aka “naked”, “bare” or “root” domains), e.g., example.com, using conventional DNS A-records are not supported on Heroku. https://devcenter.heroku.com/articles/custom-domains[1]

つまり 、、、

  • www.my-domain.com
    これは簡単に設定できます(サブドメイン付きなので)
  • my-domain.com
    これはネイキッドドメインなのでサポート対象外

なぜネイキッドドメインが使えないか

ネイキッドドメインが設定できない理由は、HerokuがDNSのAレコードに設定するためのIPアドレスを公開していないからです。
(昔は3つぐらいのIPアドレスを公開してたが、現在は公開してない)

昔のブログ記事などでHerokuが公開しているIPアドレスをAレコードに〜というモノがあります。 が、現在では使えない手法なので注意です。

とはいえ、自分のサービスにネイキッドドメインを使いたくなるのが人情なので、以下はHerokuでネイキッドドメインを使う方法を紹介します。

Herokuでネイキッドドメイン(ルートドメイン)を使う方法

1)Dozensを使ってネイキッドドメイン設定する

Dozensを利用してHeroku上のアプリでネイキッドドメインを有効にするためのスクリプトを書いてみました。Heroku上で動くタイマー仕掛けのアプリです。
IP-Updater-For-Heroku
Config.pyを編集して、そのままHerokuにデプロイするだけで、ネイキッドドメインが有効になります
Dozenzのアカウントは事前に取得が必要です。またAレコード以外はDozenzの管理画面で設定してください

良い点:ネイキッドドメインをメインURLに設定できる。無料でできる
悪い点:自動更新用アプリをHerokuにデプロイするなど一手間かかる

以下にある2と3は、Heroku公式に掲載されているネイキッドドメイン利用方法です。が、どうも決め手にかけます。ので、自分でスクリプトを書いたわけですが。。

2) CNAMEぽくAレコードを設定できるDNSサービスを利用する

CNAME functionality at the apex

良い点:お手軽にネイキッドドメインが使えるようになる!
悪い点:お金がかかります

リンク先のDNSサービスを利用すると、IPアドレスが不明でもCNAMEぽくAレコードを設定可能です。ただ、微妙に有料だったりするので、もう1歩感があります。

3)ルートドメインへのアクセスをサブドメイン付きにリダイレクトする

Subdomain redirection

良い点:DNSにサクっとレコード追加するだけでお手軽です
悪い点:メインのURLはサブドメイン付きになります

URLやForwardというレコードを設定できるDNSサービスを利用している場合は、ルートドメインへのアクセスを301でサブドメインにリダイレクトすることができるようです。
こんな感じで設定するようです。

Record Name Target
URL or Forward example.com www.example.com.
CNAME www example.herokuapp.com.

これで、ルートドメイン(example.com)を叩いても繋がるようにはなります。
ただ、結局はサブドメイン付きのwww.example.comへリダイレクトしているだけなので
メインURLをネイキッドドメインにしたいという希望とは違う気がします。

IP-Updater-For-Herokuの仕組み

基本的には、公式から出ているipserver-updaterをPythonで書き直しただけです。Herokuでの利用を想定しています。

具体的には、以下の作業を20分置きに自動実行します。

  1. Herokuから付与されるデフォルトURLに問い合わせを行い、現在のIPアドレスを取得する
  2. 取得したIPアドレスを利用してDozenzにAレコードを設定する

自動実行させるクーロン的な動きをさせるのは、このあたり参考にしました。APScheduler使っています。