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_CONFIG は APP_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




参考

Top 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.