Heroku最速移行メモ
SinatraとDataMapperで作ったWebアプリをHerokuに移行した時のメモ。
この記事では以下のような作業について書いています。
- Herokuに移行した理由
- 必要なもの
- アプリケーションの作成
- デプロイ
- データベースの移行
- 設定の管理
- キャッシュの利用
- 独自ドメインの利用
Herokuに移行した理由
小規模であれば無料で使えて、かつロックインされないからです。特にロックインされないという点は非常に重要で、先日Google App Engineの料金体系が変更された際に終了に追い込まれてしまったサービスが幾つかありましたが、Herokuでは同じようなことがあっても他の環境に逃げればいいだけなので安心です。
必要なもの
Bundler : gemの管理はBundlerで行います。
git : デプロイはgitで行うので、アプリケーションのファイルはgitで管理しておく必要があります。
アプリケーションの作成
Herokuの操作はほぼすべてgemをインストールしてherokuコマンドで行います。
heroku createコマンドでアプリケーションを作成します。初回はメールアドレスとパスワードの入力、および公開鍵の送信を行いますが、指示に従って進めればOKです。
この時、ローカルのgitリポジトリのremoteにherokuが追加されます。
デプロイ
デプロイはリモートのリポジトリにpushするだけです。push後に自動的に依存関係の解決が行われ、アプリケーションが動作するようになります。
データベースの移行
Herokuでは無料の範囲だとRDBMSにPostgreSQLを使うことになります。私はこれまでSQLiteを利用していましたが、RDBMSの違いはDataMapperが吸収してくれるので接続先のURLを変更するだけで移行できました。
Herokuでの接続先はDATABASE_URLという環境変数で渡されます。以下のようにすると、Heroku上ではPostgreSQL、ローカルではこれまでどおりSQLiteで作業できます。
データベースのマイグレーション・アップグレードはrakeで行います。すでに利用している場合は問題ありませんが、そうでなければGemfileにrakeを追加し、Rakefileを作成する必要があります。
作成したタスクはheroku rakeコマンドで実行します。
データの移行
これまでのデータを移行するにはtapsというgemを利用します。インストールしてheroku db:pushコマンドでデータを送信します。元のデータベースは、SQLiteであれば”sqlite://データベースへの相対パス”、PostgreSQLであれば”postgres://user:password@host:port/database_name”のように指定してください。
設定の管理
ソースコード内に書き込みたくない情報は、設定ファイルに分離してリポジトリには含めないようにすると思いますが、Herokuでのデプロイはgit pushで行うため、リポジトリにないファイルをリモートに置くことができません。そこで、Herokuでは設定のやり取りに環境変数を利用します。
以下のコマンドで設定を行うことができます。設定を追加するとアプリケーションは自動的に再起動して設定が反映されます。
接続先のときと同様に、Ruby側ではENVで参照できます。
キャッシュの利用
Herokuではデフォルトの構成ですでにVarnishが挟まっていて、Cache-Controlヘッダを設定するだけで適切にキャッシュしてくれます。
独自ドメインの利用
custom_domainsというアドオンの追加とDNSの設定が必要です。
DNSの設定では、以下の3つのIPアドレスのaレコードを追加します。
- 75.101.163.44
- 75.101.145.87
- 174.129.212.2
以下はバリュードメインでの設定例。
問題点
Herokuはgitのsubmoduleに対応していません。根本的な解決方法はないので、おとなしくファイルを自分のリポジトリに追加しましょう。
おわりに
いくつか作業は必要でしたが、割とあっさりRackアプリが動いてしまったのは驚きでした。他の環境で動作する状態が崩れていないのがすばらしいですね。
GAEのイメージでこの手のサービスは独自のルールがあって面倒なのではないかと思っていたのですが、Herokuではそんなことはまったくなく、もっと早く手を出していればよかった、というのが率直な感想です。