背景
- 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がよさそう。