gem heroku_sanでHerokuをもっと便利に扱う方法。
セコンさん (id:secondlife)がcookpadの開発部長になられましたね。おめでとうございます!
並々ならぬ努力の賜物なのですよね。負けてられません!
さてさて、去年の暮れ頃からPHPからRubyを書く様になって、様々なTipsが溜まってきたので、コンスタントに記事書きたいなと思っています。
では本題。
gem heroku_san って何?
現在弊社サービスClipieはHerokuで運用されています。
Clipie
http://clipie.it/
Heroku
http://www.heroku.com/
そこで、日々clipieを改善、運用している訳ですが、もっと便利にherokuを使いこなせる様な物がないのかなと調べていまして、今回の記事のタイトルであるheroku_sanというgemを発見しました。
gem heroku_sanについて調べましたので、説明します。
gem heroku_sanについて
gem heroku_sanはHerokuとのやりとりを支援するgemになります。
公式のgem herokuがありますが、サービスの運用面での支援に向いたgemになります。
RubyGems
http://rubygems.org/gems/heroku_san
Github
https://github.com/fastestforward/heroku_san
下記インストール方法、使用方法について (Github のREADMEにも書いてあります)
インストール方法
Rails 3の場合はGemFileに下記を追加
group :development do gem 'heroku_san' end
その後bundle installを行います。
下記コマンドを行い、config/heroku.ymlを作成
rails generate heroku_san
heroku.ymlで各アプリのstackや環境変数を定義する事が出来ます。
作成されるheroku.ymlは下記
# # Format: # # <stage name>: # app: <Heroku app name> # stack: <Heroku stack, optional> # tag: <git tag pattern, optional> # repo: <git repository, optional> # config: # - <Heroku config:var name>: <Heroku config:var value> # production: app: awesomeapp stack: bamboo-ree-1.8.7 tag: production/* config: BUNDLE_WITHOUT: "development:test" GOOGLE_ANALYTICS: "UA-12345678-1" staging: stack: cedar app: awesomeapp-staging config: &default BUNDLE_WITHOUT: "development:test" demo: app: awesomeapp-demo config: *default
(Rails2, SInatraの方法は割愛)
これでインストールは完了です。
次に使用方法を説明します。
使用方法
Github上のUsageのコピーですが、heroku.ymlに記述されるアプリに対して下記の様な事が可能になります。
rake heroku:addons # Install addons for the application. rake heroku:addons:local # List configured addons, without installing them rake heroku:apps # Lists configured apps rake heroku:apps:local # Lists configured apps without hitting heroku rake heroku:config # Add config:vars to each application. rake heroku:config:list # Lists config variables as set on Heroku rake heroku:config:list:local # Lists local config variables without setting them rake heroku:config:rack_env # Add proper RACK_ENV to each application rake heroku:console # Opens a remote console rake heroku:create # Creates the Heroku app rake heroku:create_config # Creates an example configuration file rake heroku:db:migrate # Migrates and restarts remote servers rake heroku:db:pull # Pull database from stage to local dev database rake heroku:deploy[commit] # Pushes the given commit, migrates and restarts (default: HEAD) rake heroku:deploy:after # Callback after deploys rake heroku:deploy:before # Callback before deploys rake heroku:deploy:force[commit] # Force-pushes the given commit, migrates and restarts (default: HEAD) rake heroku:logs # Shows the Heroku logs rake heroku:logs:tail # Tail the Heroku logs (requires logging:expanded) rake heroku:maintenance # Enable maintenance mode rake heroku:maintenance_off # Disable maintenance mode rake heroku:maintenance_on # Enable maintenance mode rake heroku:push[commit] # Pushes the given commit (default: HEAD) rake heroku:push:force[commit] # Force-pushes the given commit (default: HEAD) rake heroku:rake[task] # Runs a rake task remotely rake heroku:remotes # Add git remotes for all apps in this project rake heroku:restart # Restarts remote servers rake heroku:share # Adds a collaborator (asks for email) rake heroku:unshare # Removes a collaborator (asks for email) rake heroku:stage:all # Select all Heroku apps for later command
環境変数がheroku.ymlで管理出来、heroku.ymlで実質アプリ名のエイリアスが設定出来る等、運用面をサポート出来る点は便利です。
(個人的には環境変数の設定をyamlで管理出来るの嬉しい!)
なので、下記の様に扱う事が出来ます。
rake staging deploy # => ステージングにアプリをデプロイ(git push heroku master)を行い、マイグレーションを行う。(heroku run rake db:migrate) rake all heroku:config # => heroku.ymlに記述されている全てのアプリの環境変数を設定
これだけでも便利なのですが、(個人的にやってみたい事があり)1つのアプリを複数のHeorkuアプリにデプロイしたい場面が発生しました。
その際、各アプリに対して直列で通信を行う為、何十というアプリに対してデプロイを行っていては日が暮れてしまいます。
なので、マルチプロセスでheroku_sanが扱える様にしてみました。
(これが言いたかったが為に記事書いたんだろって突っ込んだらダメですよ。)
gem heroku_sanの並列化
gem heroku_sanのcontributor Elijah Millerさんからアイディアを頂きながら、parallelオプションを作成しました。
(Rubyでマルチプロセス、マルチスレッドプログラミングはgem parallelが超便利!セコンさんの記事が分かり易いです。http://subtech.g.hatena.ne.jp/secondlife/20110927/1317123109 )
gem heroku_san (parallelオプションサポート)
https://github.com/camelmasa/heroku_san
コードの変更点
https://github.com/camelmasa/heroku_san/commit/4dbb83c204af3b7d3058869bc8fc8c4ae5d418ec
下記の様にコマンドを実行出来ます。
rake parallel heroku:create # => heroku.ymlに記述されているアプリを全て作成 rake parallel heroku:deploy # => heroku.ymlに記述されているアプリを全てデプロイ rake parallel heorku:remove # => heroku.ymlに記述されているアプリを全て削除
30アプリ位を一瞬で作成 -> デプロイ出来るのは感動です!
Heroku使いの人に是非触って欲しい。
まとめ
gem heroku_san便利なので、Heroku使われてる方は1度試されてはと思います。
heroku_sanの並列化について、嬉しい人は少数派だと思われますが ;)
並列で思い当たるのは、何か時間がかかる処理を何十というHeorkuアプリで動かしたり出来ますよね。
Dos攻撃や、簡易的な集計処理等も無料で出来ますね。
[PR]Spreeの情報を集めています。
ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/