hamayuzinの日記

エンジニアとかデータサイエンティストとかやってます。あの時 あれやってたな的な備忘録にできれば。

【Rails/encrypted secrets】rails5.1からのencrypted secretsに移行する

何度かrailsアプリケーションで、secretsからencrypted secretsに移行したので、メモ

やること - .env等使わず、encrypted secretsだけで運用する - database.ymlの情報も secretsから読み込むようにする - 諸事の事情で、ENVに入れるようにする

encrypted secrets導入

新しく、secrets.yml.keysecrets.yml.enc を作成する

bundle exec rails secrets:setup

secrets.yml.encに secrets.ymlのように情報記入

EDITOR=vim bundle exec rails secrets:edit 

で、editor開いて 記入していく。

今回は、application内で、ENVで拾うので

development:
  aws_access_key_id: hogehoge

produciton:
  aws_access_key_id: fugafuga

のように、環境名以下の階層だ1段だけにする

secrets.yml を削除する

忘れないうちに削除しておく

database.ymlの更新

だいたい毎回こんな感じ

default: &default
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: <%= ENV['DATABASE_NAME'] %>
  host: <%= ENV['DATABASE_HOST'] %>
  username: <%= ENV['DATABASE_USER_NAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>

test:
  <<: *default
  database: <%= ENV['DATABASE_NAME'] %>
  host: <%= ENV['DATABASE_HOST'] %>
  username: <%= ENV['DATABASE_USER_NAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>

staging:
  <<: *default
  database: <%= ENV['DATABASE_NAME'] %>
  host: <%= ENV['DATABASE_HOST'] %>
  username: <%= ENV['DATABASE_USER_NAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  reconnect: true
  port: 3306
  pool: 15

production:
  <<: *default
  database: <%= ENV['DATABASE_NAME'] %>
  host: <%= ENV['DATABASE_HOST'] %>
  username: <%= ENV['DATABASE_USER_NAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  reconnect: true
  port: 3306
  pool: 20

rails起動時に、secretsからENVに情報を吐く

config/application.rbに下記追加

    secrets = YAML.parse(Rails::Secrets.read).to_ruby[Rails.env]
    secrets.each do |key, value|
      ENV[key.upcase] = value.to_s
    end

既存のRails.application.secretsをENVに更新

Rails.application.secrets になっている部分を、ENV['HOGEHOGE']に

environmentsに設定追加

config/environments/*の各設定ファイルに

config.read_encrypted_secrets = true

後は、動くかチェック