heroku で 独自ドメインを使う際の最善策を考えた
herokuで独自ドメインのルートを使うのは結構めんどくさい。
サイトによって情報がいろいろ違うので、何がベストなのかを探ってみました。
ルートドメインとは、www.workabroad.jpではなくてworkabroad.jpのこと。
( apex / bare / naked domainなんて呼ばれることもある)
IPアドレスはない。
herokuでは各アプリに固定のIPは振り当てられません。
ということはDNS設定でAレコードに値を入力できないということ。
困りますね。
いろいろ見てると、AレコードにこのIP入れたらいけるよ、
というブログも見かけましたが、公式ドキュメントによると推奨されていなく、
アクセスが多い時にはアプリのパフォーマンスに影響しますよ、とも言われている。
The Limitations of DNS A-Records
エイリアスを使えと言われても。。
で、公式ドキュメントにはCNAMEのように振る舞うALIASを使うといいよと書いてある。
point the ALIAS or ANAME entry for your apex domain to example.herokuapp.com, just as you would with a CNAME record.
ただ、ALIASに対応しているDNSホスティングがあまりない。
ドメイン取得したところのDNSを使うことが多いと思うけど、ムームードメインはだめだった。SakuraのVPSを契約しているから見てみたけど、それもダメ。
ということで、他のDNSホスティングサービスを利用することに。
よく見かけるdozensというところはなんとherokオプションなんてのもあって、速攻でできそう!と思ったんだけど、、、思いっきりAレコード!!
ということで、やめました。
いろいろ見たんだけど、無料のサービスでは難しそうだった。。
Amazon Route53
RailsプロジェクトでAmazon S3使っているので、Route53でやってみることにした。
herokuのDevセンターをドキュメントを参考にしました。
Configuring Amazon Route 53 DNS for your Heroku App
ドメインをherokuに登録
これは管理画面からでもいい。
コマンドでやりたいなら下記。wwwサブドメインも含めて2つ登録すること。
1
2
$ heroku domains:add example.com
$ heroku domains:add www.example.com
Amazon Route53の設定
まずは画面上部からCreate Hosted Zoneを選択。
example.comを入力する。ルートドメインでいい。
で、そのゾーンを編集します。
Create Record Set をクリックして下記のように設定。
exampleは自分のheroku appの名前。
- Name: www
- Type: CNAME
- Value: example.herokuapp.com
S3にバケットを作成
実はRoute53だけじゃできなくて、S3も使う。
Create Bucket で新しいバケット作成。
名前はルートドメインにする。ここでは、example.com。
Propertiesを選択して、Static Website Hostingを選択。
Redirect all requests to another host nameを選びます。
なんのことはない、リダイレクトしてるだけですね。
サブドメイン( www.example.com )を入力してSaveします。
Aレコードの設定
Route53に戻ります。
Create Record Setをして、次のように。
- Name:(空欄)
- Type: A
- Alias: Yes
- Alias Target: S3 Website Endpointに先ほど登録したBucket名が表示されているので、それを選択。
セーブします。
DNSサーバー設定
左上のHosted Zonesをクリックすると、画面右で確認できます。
にこんなのがあるはず。
- ns-904.awsdns-49.net
- ns-1254.awsdns-28.org
- ns-1840.awsdns-38.co.uk
- ns-65.awsdns-08.com
ドメインを管理している会社(ムームードメインとか)のコントロールパネルにいって、
DNSサーバーを切り替えましょう。
ムームードメインはこんな画面です。
切替完了です。
Route53のTTL設定で切替の時間を短縮できると思います。
結局wwwだけど。。
ルートドメインにアクセスすると、思いっきりwwwのサブドメインにリダイレクトされます。
そりゃそうです。そう設定したのだから。
ルートドメイン使えてないじゃん!ってなりますけど、ググった限りではこれがアプリにIPをハードコーディングしない最善の方法でした。
ルートのほうが格好よく見えるけど、それはサイト作ってる側の自己満足かもしれない。
ちゃんとユーザーはコンテンツにたどり着くから、今回はこの方法で行くことにした。
でもやっぱりルートが欲しい気持ちもあるので、いい方法があれば教えてください。
参考
AWS S3 のバケットに独自ドメインを割り当てて、静的ファイルをホスティング