Herokuの公式ドキュメントは英語なので読みづらいですよね。herokaijp/devcenterのように、有志が日本語訳してくれているドキュメントもありますが、その中でも特に抑えておきたい16個の常識について挙げてみました。(16日に公開する予定の記事なので、何となく16個挙げてみました。。)
目次
- 1 (補足)Herokuを使う上での登場人物の名前
- 2 常識1. Dynoは1時間アクセスがないとアイドル状態になる
- 3 常識2. Dynoにファイルアップロードしても再起動時に消える
- 4 常識3. Dyno起動時間の無料枠は750時間
- 5 常識4. heroku runで立ち上がるDynoはOne-off Dynoと呼ばれるものである
- 6 常識5. One-off Dynoの利用時間も課金時間に加算される
- 7 常識6. Dynoの環境変数はheroku config系コマンドで登録する
- 8 常識7. 1 Dynoに割り当てられるメモリは512MB
- 9 常識8. Dynoのパワーを2倍にできる
- 10 常識9. Dyno内の常駐プロセスがクラッシュした場合、自動的にリスタートが走る
- 11 常識10. Dynoに固定IPは割り当てられない
- 12 常識11. レスポンスまでに30秒かかるリクエストは問答無用でタイムアウトになる(H12 Error)
- 13 常識12. rake assets:precompileを失敗させない設定がある
- 14 常識13. slugサイズが大きくなりすぎたら.slugignoreで対象外ファイルを除外できる
- 15 常識14. リリースのロールバックができる
- 16 常識15. rubyバージョンをGemfileで指定できる
- 17 常識16. Herokuのステータスは http://status.heroku.com/ で確認できる
- 18 おわりに
(補足)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なんで、本番も合わせたいです」
Gemfile
にruby "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からメッセージを下さい!
本番環境のデータをステージングにリストアするなど、アドオンに焦点をあてた記事も書いてみたいですね。