LoginSignup
2
0

More than 5 years have passed since last update.

yaml_vaultとRailsとconfigまわり

Posted at

背景

  • Rails5.2でencrypted secretsが導入されたが取り回しがしにくい
  • yaml_vault は便利
  • Rails5.2でconfig/secrets.ymlを置いても Rails.application.secrets にロードしてくれない
  • 自前で任意のyamlをロードするようにしてもよいが、config を使うと規定できて楽

configとyaml_vaultの詳細についてはそれぞれのドキュメントを参照

整備

セットアップ

Gemfile
# ...
gem 'config'
gem 'aws-sdk-kms'
gem 'yaml_vault'
$ bin/rails g config:install 
.gitignore
config/settings.yml
config/settings.local.yml
config/settings/*.yml

gitignoreはデフォルトだとlocal系のみになっているのですべて対象にする。

rakeタスク追加

yaml_vault.rake
YAML_VAULT_ARGS = '--cryptor=aws-kms --aws-kms-key-id=your-key-id'

namespace :yaml_vault do
  desc 'encrypt'
  task :encrypt do
    target_files = ['config/settings.yml'] + Dir.glob('config/settings/*')
    target_files.each do |target|
      dst = target.sub('config/', 'config/encrypted/')
      FileUtils.mkdir_p(File.dirname(dst))
      `bundle exec yaml_vault encrypt #{target} -o #{dst} #{YAML_VAULT_ARGS}`
    end
  end

  task :decrypt do
    Dir.glob('config/encrypted/**/*').each do |encrypted_file|
      next if FileTest.directory?(encrypted_file)
      dst = encrypted_file.sub('config/encrypted/', 'config/')
      FileUtils.mkdir_p(File.dirname(dst))
      `bundle exec yaml_vault decrypt #{encrypted_file} -o #{dst} #{YAML_VAULT_ARGS}`
    end
  end
end

上記例ではaws-kmsを使っているが、YAML_VAULT_ARGSを適宜書き換える。
暗号化したファイルはconfig/encrypted以下に出力している。

capistrano統合

deploy.rb
namespace :deploy do
  task :decrypt_secrets do
    on roles(:app) do
      within release_path do
        execute :bundle, :exec, :rake, 'yaml_vault:decrypt'
      end
    end
  end

  before :updated, :decrypt_secrets
end

capistranoのhookタイミングとしてはupdatedがよさそう。

2
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
2
0