ユカシカド エンジニアブログ

体の栄養状態を把握する検査サービス VitaNoteを開発するエンジニアのブログ

Railsアプリをheroku + Gehirn DNS + Rapid SSLでhttps://ルートドメインで運用できるようにしたメモと感想

いきなり表題と関係ありませんが、本日ユカシカドは2周年を迎えました!ぱちぱちぱち!
一言でいうと、あっ?!と言う間でしたね。2周年くらいではまだお一人様開発のままであります。。

今までは基本的に内向きのアプリケーションの開発しかしてこなかったので、VPSでだいたい事足りていたのですが、いよいよ外向きにサービスをリリースする準備に入りました。
そこでですね、今回その一環でやったことをまとめてみて、そうそう頻繁にやらない作業なので絶対に、絶対忘れるだろうと思い、メモしておきます。

この構成のそもそもの目的

  • 将来的にサービスをスケールできるようにすること、という前向きな気持ち!と、
  • アプリケーションサーバとして割り切って考える事でインフラ管理のコストを最小限にしたいという効率化と、
  • イマドキの環境をいまのうちに(サービスに対する要求が緩やかなうちに)さわっておきたいという下心!
  • (と、AWSムズカシイ)

流れ

herokuにアプリケーションをデプロイできているという前提で、

  1. 秘密鍵を準備する
  2. SSL証明書の購入と準備
  3. herokuとDNSのセットアップ
  4. Railsの設定でAlways On SSL

1. 秘密鍵を準備する

秘密鍵を作成

$ openssl genrsa -des3 -out server.orig.key 2048

パスワードを解除した鍵を作成

$ openssl rsa -in server.orig.key -out server.key

署名リクエストを作成

$ openssl req -new -key server.key -out server.csr

2. SSL証明書の購入と準備

Rapid SSLで¥4,300/年の証明書を購入しました。安いですねー。いつかはEV-SSL

中間証明書を取得

$ curl https://knowledge.rapidssl.com/library/VERISIGN/ALL_OTHER/RapidSSL%20Intermediate/RapidSSL_CA_bundle.pem > rapidssl_bundle.pem

メールで送られてきたサーバ証明書からファイルを作成

$ touch server.orig.crt
$ vi server.orig.crt # 内容をコピペ。

中間証明書とサーバ証明書を結合

$ cat server.orig.crt rapidssl_bundle.pem > server.crt

3. herokuとDNSのセットアップ

もともとドメインムームードメインで取得してDNSもそのまま使用していたのですが、herokuでルートドメインを使用する為には、IPアドレスが動的に変わってしまう為、特別な方法が必要となるようです。
そこで必須なのがゾーン情報にALIASレコードを設定できること。
ルードドメインのAレコードにはIPアドレスが必要ですが、それが動的に変わってしまう為、herokuから付与されたホスト名を設定できるようになるAWS向けのDNS独自拡張のようなもののようです。

参考

Gehirn DNS

海外も含めると今回の用途にあうDNSサービスがいくつかあるようですが、日本語で明快な説明があって、2ドメインまで無料のフリープランがある、Gehirn DNSへ移行して、設定をおこないました。

SSLアドオンを追加する

herokuのアドオンを追加します。このアドオンには$20/月がかかるので、事前にクレジットカードを登録しておく必要があります。

$ heroku addons:add ssl

herokuに証明書を追加する

$ heroku certs:add server.crt server.key

Resolving trust chain... done
Adding SSL Endpoint to my-app... done
my-app now served by ****.herokussl.com
Certificate details:
Common Name(s): mydomain.com
Expires At:     2016-03-12 19:06 UTC
Issuer:         /OU=GT15485972/OU=See www.rapidssl.com/resources/cps (c)15/OU=Domain Control Validated - RapidSSL(R)/CN=mydomain.com
Starts At:      2015-03-10 14:14 UTC
Subject:        /OU=GT15485972/OU=See www.rapidssl.com/resources/cps (c)15/OU=Domain Control Validated - RapidSSL(R)/CN=mydomain.com
SSL certificate is verified by a root authority.

DNSの設定

herokuに証明書を追加するとSSL対応のホスト名、****.herokussl.comが付与されるので、ターゲットのドメインにAliasレコードとして設定しました。

4. Railsの設定でAlways On SSL

Railsアプリケーション上の通信を常にSSLでおこうなう

特にそうしない理由はなく、Googleも強く推奨しているし、そもそものセキュリティ確保とそれ以外にもメリットがあるので、せっかくなのでこの設定を追加しておいたほうがよさそうです。

config/environments/production.rb

config.force_ssl = true

参考

やってみて

多少のお金で、デプロイ環境含めてインフラをそれぞれ切り離して考えられるのは思っていた以上にメリットがあると感じました。
正直スケールできることのメリットは、その必要に迫られたときしかわからないので、必要に迫られるように頑張っていこうと思います。
他にも、落とし穴と言われることもあるようですが、多少は頭ぶつける覚悟で対応していきます。

おまけ:「初めてのheroku」な時に非常に参考になったスライド