知っておきたい!Herokuを使う上では当たり前?の16の常識

Herokuの公式ドキュメントは英語なので読みづらいですよね。herokaijp/devcenterのように、有志が日本語訳してくれているドキュメントもありますが、その中でも特に抑えておきたい16個の常識について挙げてみました。(16日に公開する予定の記事なので、何となく16個挙げてみました。。)

(補足)Herokuを使う上での登場人物の名前

Dyno

「だいの」と呼びます。1Dynoと言ったとき、一つサーバが立ち上がっているようなものだと考えて下さい。

Routing Mesh

Herokuアプリにアクセスがあったときに、Dyno間の負荷をロードバランスしながらリクエストを振り分ける機構をRouting Meshと呼びます。たまに「Router Error」というログを吐くのですが、そのとき障害が起こっている場所はここです。

常識1. Dynoは1時間アクセスがないとアイドル状態になる

「うわー、なんだよ、全然アプリ起動しないじゃん。」

というときは、大体Dynoがアイドル状態になっています。1時間アクセスがなかったので停止してしまったんですね。こんなことにならないためには、Dynoを叩き起こし続ける設定をしておくのが肝要です。

Heroku Schedulerで叩き起こす

1時間毎にcurl http://your-app-name.herokuapp.com/というコマンドを叩くように設定すれば、起き続けます。

NewRelicのAvailability Monitorで叩き起こす

別にNewRelicでなくても良いのですが、アドオンがあるので一番設定が楽ですね。その他Nagios、Zabbixの監視でアクセスがあれば、アクセスがあったと判断されるので起き続けます。

2つ以上のDynoを立ち上げる

2つ以上のDynoを立ち上げているときには、アイドル状態にならない仕様になっています。2Dyno共にwebプロセスが起動している必要があります。

常識2. Dynoにファイルアップロードしても再起動時に消える

「おきのどくですが あっぷろーどしたふぁいるは きえてしまいました。」

Dynoに書き込まれたファイルはアイドル状態、または再起動したときに消えてしまいます。永続化したいファイルはS3などのファイルストレージに保存しておきましょう。画像アップロード機能があるアプリにはありがちな罠。

常識3. Dyno起動時間の無料枠は750時間

「無料って言ったじゃん!」

Herokuの請求額はDynoの利用料金と、アドオンの利用料金との合算で計算されています。

このときDynoの利用料金を考える上で、1Dyno分無料だと思われがちなのですが、具体的には750時間分の利用料金が無料となっています。

この罠が5番目の常識で、レバーに来るのですね。

常識4. heroku runで立ち上がるDynoはOne-off Dynoと呼ばれるものである

「なんということでしょう」

heroku run rake db:migrateみたいに、Dynoに対して直接コマンドを実行できたりするのですが、これは今動いているDynoに直接アクセスしているのではなく、別途One-off Dynoという一時的なDynoを立ち上げています。

実行したコマンドでDynoがクラッシュしたとしても、現在動いているアプリに影響が出ないようにする、匠の粋な計らいです。

常識5. One-off Dynoの利用時間も課金時間に加算される

「無料って言ったじゃん!(迫真)」

匠の粋な計らいが罠になってしまうのは、劇的ビフォーアフターでもよくある話です。

One-off Dynoの利用時間もDynoの利用時間に加算されます。つまり、重めのバッチ処理をHeroku Schedulerでこまめに動かしていたときなどは、750時間の無料時間を超える可能性があります。またRailsであれば、heroku run consoleなどでコンソール画面を起動しっぱなしだったりすると、そのまま利用時間に加算されてしまいますので、請求が発生してしまいます。

One-off Dynoのご利用は計画的に。

常識6. Dynoの環境変数はheroku config系コマンドで登録する

「.bashrcが読み込まれないんですけどー」

環境変数はコマンドで設定します。設定されている環境変数を見るときはheroku config、追加/編集はheroku config:add、削除はheroku config:remove。詳細はこちらのページをご覧ください。

常識7. 1 Dynoに割り当てられるメモリは512MB

「もっさりしてるよね」

512MB以上メモリを使うとスワップするので、もっさりします。メモリが足りないときはログにError R14 (Memory quota exceeded)というメッセージが出るので、適時ログ監視などでチェックしておきましょう。使用メモリが1.5GBあたりに到達すると強制終了されてしまうので、お気をつけて。

常識8. Dynoのパワーを2倍にできる

「身体保ってくれよ、2倍界王拳だ!!」

スケールアウトだけでなくスケールアップが必要になった場合、2X Dynosという設定をおこなうことができます。パワーは2倍になりますが料金も2倍になりますので、ご利用は計画的に。

常識9. Dyno内の常駐プロセスがクラッシュした場合、自動的にリスタートが走る

「プロセス監視ってどうなってるの?」

常駐プロセスはDynoにより監視されていて、クラッシュした場合はDynoごとリスタートする仕様のようです。

常識10. Dynoに固定IPは割り当てられない

「固定IPがないと困る(迫真)」

割り当てられません。

(5月28日追記:有料にはなりますがProximoというアドオンを使うことで固定IPの利用ができるようです)

常識11. レスポンスまでに30秒かかるリクエストは問答無用でタイムアウトになる(H12 Error)

「タイムアウトの秒数、変えられないんですか?」

変えられません。

タイムアウトエラーはDynoに到達する前のRouting Meshで返されるので、ユーザーがこの設定値を変更することはできません。時間がかかる処理は非同期にしましょう。

常識12. rake assets:precompileを失敗させない設定がある

「なんかエラーでRailsアプリが起動しないんですけどー」

Rails限定。rake assets:precompile中にDBを見に行くので、ややこしい問題がおこります。特に内部事情に興味のない方はconfig/application.rbに以下のコードを追加して下さい。

config.assets.initialize_on_precompile = false

興味のある方はこちらのページをご覧ください。

常識13. slugサイズが大きくなりすぎたら.slugignoreで対象外ファイルを除外できる

「ちょっとPSDファイルが大きくなりすぎちゃってぇー」

Herokuにデプロイできるサイズは、圧縮をかけた状態で200MBまでです(圧縮されたアプリケーションのコピーのことをslugと呼びます)。

ごくまれに、PSDファイルやAIファイルなどのアートワークをGitで管理していて、そのままHerokuにpushしたがために200MBを超える場合があります。

この場合.slugignoreというファイルを作成しておくと、記載しているファイルをslugに含めないように設定ができます。以下のように設定します。

*.psd
*.pdf
test
spec

そもそもそんなに大きなリポジトリをpushするのは、デプロイに時間がかかって仕方がないのでやめたいところですね。

常識14. リリースのロールバックができる

「やっべ、まじやっべ」

Herokuならやらかしたときでも安心です。

heroku releasesというコマンドを叩くと、アプリケーションのリリース履歴を見ることができます。

$ heroku releases -a mah-lab-cedar
=== mah-lab-cedar Releases
v55  Deploy a69c36b                            xxx@xxx.com  2013/04/23 08:19:03
v54  Deploy b40dd3c                            xxx@xxx.com  2013/04/18 08:23:38
v53  Deploy 0b68c90                            xxx@xxx.com  2013/04/17 10:26:46
v52  Add-on provider config update             xxx@xxx.com  2013/04/17 10:18:48
v51  Add-on add memcache:5mb                   xxx@xxx.com  2013/04/17 10:18:17

このとき、戻したいバージョンを指定してロールバックをかけることができます。heroku rollback [バージョン番号]です。

$ heroku rollback v53 -a mah-lab-cedar
Rolled back to v53

指定しなかった場合は、直近のリリースをロールバックすることができます。

ロールバックすると「ロールバックしたよ」という履歴が残るので、「ロールバックのロールバック」も行うことができます。

これでアプリのリリースも安心。念のため、DBのバックアップも取得するようにしておくと、より良いですね。

常識15. rubyバージョンをGemfileで指定できる

「ローカルではruby1.9.3なんで、本番も合わせたいです」

Gemfileruby "1.9.3"といった記載をしておくと、Herokuへのpush時にrubyのバージョンが入れ替わります。

常識16. Herokuのステータスは http://status.heroku.com/ で確認できる

「なんかHerokuにつながらないよう」

http://status.heroku.com/でHerokuのステータスを確認しましょう。heroku statusコマンドでも可。

ページにアクセスすると右上に「Subscribe to Notifications」という、自分のメールアドレス宛てに問題を通知してくれるようにする登録フォームがあるので、バリバリ使っている人は登録しておきましょう。夜中に鳴りまくって、うるさいっちゃうるさいですが。

おわりに

Herokuを使う上で、特によく聞かれるような項目について挙げてみました。アドオンよりも、Heroku本体の機能に焦点を当てたので、物足りない方もいたかも知れません。「こんなのも常識だよ」ということがありましたら、ぜひ画面右下のMessageleafからメッセージを下さい!

本番環境のデータをステージングにリストアするなど、アドオンに焦点をあてた記事も書いてみたいですね。