環境によって出し分けたいもの
- 環境変数
- 秘匿情報
- config gem
- それ以外
環境変数の課題
- マスター管理がむずい
- DMで受け渡しをしないといけない
- APIキーなどのランダム文字列だとコピペミスに気が付きにくい
- リリースの手順が増える
rails5.2から追加されたcredential機能
- git管理ができる
- クレデンシャル
- rails5.2から
- RAILS_ENVでの出し分けができない
- multi environment credentials
- rails6から
- RAILS_ENVでの出し分けができる
さらに同じrails env内でも出し分けたい
前提
AWS環境にdevelopment(開発用), staging(検証用), prod(公開用)の3環境を用意している。
3環境ともRAILS_ENVは一律production
環境変数TIER_ENV
を用意して3環境の判別を行っている。
やりたいこと
- production環境の秘匿情報を出し分けたい。
- production.yml.encで
production:
api_key:
staging:
api_key:
development:
api_key:
と名前を切って出し分けているのを
production/production.yml.enc
production/staging.yml.enc
production/development.yml.enc
とファイル単位で分けたい。
- staging.rbなど
config/environments/
にproduction.rbのコピーを追加するのは避けたい
やったこと
-h を読む
bin/rails credentials:edit -h
In addition to that, the default credentials lookup paths can be overridden through
`config.credentials.content_path` and `config.credentials.key_path`.
読み込むファイル設定
config/application.rb
config.credentials.content_path = Rails.root.join("config/credentials/#{ENV['RAILS_ENV']}/#{ENV['TIER_ENV']}.yml.enc")
config.credentials.key_path = Rails.root.join("config/credentials/#{ENV['RAILS_ENV']}/#{ENV['TIER_ENV']}.key")
平仄を合わせる
production/production.yml.enc
production/staging.yml.enc
production/development.yml.enc
development.yml.enc
test.yml.enc
になっているので
これまで3環境の判別に使っていたTIER_ENV
にlocal, testと言う値を追加して
production/production.yml.enc
production/staging.yml.enc
production/development.yml.enc
development/local.yml.enc
test/test.yml.enc
書き換える
-
config/credentials.yml.enc
の中身を下記コマンドで各環境ファイルに移動する
コマンド
-
-e
オプションでパス指定する -
productionモード
-
production
EDITOR='vi' bin/rails credentials:edit -e production/production
-
staging
EDITOR='vi' bin/rails credentials:edit -e production/staging
-
development
EDITOR='vi' bin/rails credentials:edit -e production/development
-
-
developmentモード
EDITOR='vi' bin/rails credentials:edit -e development/local
- testモード
EDITOR='vi' bin/rails credentials:edit -e test/test
動作確認方法
- springのプロセスを殺す
- 下記コマンドで起動したpryで
Rails.application.credentials
の結果の@content_path
と@key_path
が指定したファイルになっていること - 下記のような指定方法で設定した値が復号できること
Rails.application.credentials[:hoge]
=> local
コマンド
-
RAILS_ENVと
-e
オプションも指定する-
productionモード
- production
RAILS_ENV=production TIER_ENV=production bin/rails c -e production
- staging
RAILS_ENV=production TIER_ENV=staging bin/rails c -e production
- development
RAILS_ENV=production TIER_ENV=development bin/rails c -e production
-
developmentモード
RAILS_ENV=development TIER_ENV=local bin/rails c -e development
- testモード
testの時はrails consoleで確認できなかったのでspecのどこかでbinding.pry
-
環境へ適用
- elasticbeanstalkの場合ヘルスチェックを無視する
- RAILS_MASTER_KEYの値を修正する
例えばstg環境の場合RAILS_MASTER_KEY
をconfig/credentials/production/staging.key
の値に設定する - デプロイコマンドの実行
- puma/puma.logを確認する
- エラーが出ていたら修正する(seacret_key_baseがないと怒られた)
- 疎通確認
感想
- credentials:editの際content_pathで指定してるんだから
-e
オプションを付けなくてもそっちを見て欲しかった。 - 本番反映がうまく行かないと思ったらRACK_ENVによる指定になっているのに気づかずしんどかった
- 下記にすれば
RAILS_ENV
でもRACK_ENV
でもいけると思ったがダメだった
"config/credentials/#{Rails.env}/#{ENV['TIER_ENV']}.yml.enc"