5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

production環境の秘匿情報を出し分けたい。

Last updated at Posted at 2021-03-11

環境によって出し分けたいもの

  • 環境変数
  • 秘匿情報
  • 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_KEYconfig/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"
5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?