WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

Herokuへのデプロイで1時間近く嵌った件

   

Missing `secret_token` and `secret_key_base` for ‘production’ environment, set these values in `config/secrets.yml`

Heroku、便利ですね。
CLIツールインストールして`git push heroku master`実行するだけでデプロイできます。

ところが今日はHerokuへのデプロイで大嵌りしました。
正確に言えばデプロイ自体は成功したんですが、`heroku open`を実行してアプリにアクセスすると、以下のメッセージが出ます。

Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml` 

エラーの意味はすぐにわかりました。
Rails4.1からは秘密の情報を記録するためのファイルとしてsecrets.ymlが導入されましたが、このファイルで記載するべきディレクティブである`secret_key_base`の値が定義されていないということが原因です。

対処法

secrets.ymlをgitの管理下に置く

そもそもsecrets.yml自体が.gitignoreでgitの管理下に置かれていないので.gitignoreから`config/secrets.yml`の1行を削除し、config/secrets.ymlを追加します。
ただし、secrets.ymlを開き、下記のようにデータが環境変数で置き換えられていてハードコーディングされていないことを念のため確認(gitに含めて問題ないかを確認)しておく必要があります。

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

Heroku側での環境変数設定

これでpushして、Heroku側で環境変数設定すれば終わり。

$ git push heroku master
$ heroku config:set SECRET_KEY_BASE=`ruby -rsecurerandom -e "puts SecureRandom.hex(64)"`

のはずなんですが、今回はこの手順を踏んだ後も下記のエラーが出続けました。

Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml` 

Heroku側の環境変数を確認できるコマンドがあるのでそれを実行してみます。

$ heroku config -s
SECRET_KEY_BASE=xxxxxx
SECRET_TOKEN=xxxxxx
_SECRET_SECRET_KEY_BASE=
_SECRET_SECRET_TOKEN=''

ん?_SECRET_SECRET_KEY_BASEとかいうキーがあるじゃないか。
もしかしてここに設定しないとダメなのか?

ということでここにセットしてみたところ、うまくいきました。

heroku config:set _SECRET_SECRET_KEY_BASE=`ruby -rsecurerandom -e "puts SecureRandom.hex(64)"`

 - Ruby on Rails , ,