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/