アインシュタインの電話番号
2011.01.30
HerokuとGitHubの両方にプッシュする時の秘密にしたい値の扱い

HerokuとGitHubの両方にプッシュできるようになったのはいいけど、例えばTwitterのOAuth認証用のトークンとか、何かのAPIを利用するためのAPIキーとか、あるいはもっと大事な何かのパスワードなど、秘密にしておきたい情報はGitHubにプッシュしてしまうと全世界に公開されるので非常にマズい。

かといって書いておかないと、Herokuにプッシュしたときに情報が足らなくてアプリが正常に動かない。どうするん? 毎回消したり書いたりするの?って悩んでたら、Herokuヘビーユーザーな先人達が既に解決していた

herokuコマンドでconfigオプション

解決策を読んでみると、herokuコマンドにはそのためのオプションがちゃんと用意されていて、それを使えばスマートに処理できるとのこと。ようは、herokuコマンドで秘密にしておきたい情報を仕込んでおけば、rubyスクリプト内でそれを呼び出せるようになる。

$ heroku config:add HOGE="ほげほげ"

上記のように設定すると、rubyスクリプト内で以下のようにして ENV['addで指定したキー'] 経由で呼び出せる。

get '/hoge' do
  ENV['HOGE']
end

これでHerokuにプッシュして、http://heroku-hello-world.heroku.com/hogeにアクセスすれば、addで指定した値である「ほげほげ」がちゃんと表示される。また、GitHubにはこのままプッシュしても値は表示されないので何も問題がない。

削除したいときはremove

設定した情報を削除したいときremoveを使って、

$ heroku config:remove HOGE

で消せる。全部のENV情報を消すclearというのもあるんだけど、これは将来的なバージョンで使えなくなるっぽい。現在設定されている情報の一覧はheroku configで表示できる。Herokuって素晴らしいですね。

ローカルプレビューの時は?

問題はローカルプレビューの時はどうするのかな?と。上記のやり方はherokuコマンドを利用したときのみに有効になるっぽいので、ローカルでテストしているときは使えない。

今のところ、ENV['HOGE']の値がnilだったら、秘密情報が書かれたローカル用のファイルをrequireする、というような記述をして、そのファイルに定数として値を持たせる方法を使っている。で、そのファイルは.gitignoreでアップロードしないように、と。

この方法はあんまりスマートじゃない気がするけど、一応目的は満たせている。もっと良い方法があったら教えてください。


Heroku - ソース中のパスワードなどの処理 - komagata [p0t]