DEV Community

Cong
Cong

Posted on

Rails credentials.yml.encと環境変数の併用

Rails 5.2 から暗号化された config/credentials.yml.enc が導入され、混乱を招いている。開発の都合上、development, test では環境変数を使って、production (または stagingなど)encrypted credentials を使えるように、config/environment.rb にクラス Envを導入してみた。

class Env
  def self.method_missing(name, *default)
    ENV[name.to_s] ||
      default.first ||
      Rails.application.credentials.send(name) ||
      super
  end

  def self.respond_to_missing?(*)
    true
  end
end

使い方

システム構成情報は、環境変数またはconfig/credentials.yml.encに設定する。Env.APP_CONFIGAPP_CONFIG をまず環境変数 ENV から探して、未設定の場合に encrypted credentials から探す。なお、引数にデフォルトの値が与えられたら、encrypted credentials からは探さない。

サンプルをGitHubに載せている。

config/credentials.yml.enc の内容確認

$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 rails credentials:show
secret_key_base: 2105bc31227a27f81b901582a8bb43b35bebea2b9c3572b024184a0b06dad26fc3bb312fbc5a7069783798d22f55cf4f411ae19169dd2a78026dccfbbdc889d7
APP_CONFIG: encryptedConfig




環境変数が未定義の場合、デフォルト値が使われる


$ rails runner 'puts Env.APP_CONFIG("default")'
default




環境変数がデフォルト値よりも優先される


$ APP_CONFIG=envVar rails runner 'puts Env.APP_CONFIG("default")'
envVar




環境変数が、encrypted credentials よりも優先される


$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 APP_CONFIG=envVar rails runner 'puts Env.APP_CONFIG("default")'
envVar




デフォルト値が encrypted credentials よりも優先される


$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 rails runner 'puts Env.APP_CONFIG("default")'
default




環境変数もデフォルト値も未定義の場合、encrypted credentials が使われる


$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 rails runner 'puts Env.APP_CONFIG'
encryptedConfig




参考

Latest comments (2)

Collapse
 
heboy profile image
赵壮实

Hi there,I heard that the software industry in Japan is not developed,is that true?

Collapse
 
vochicong profile image
Cong

No, it's not true.