概要
今までRailsでサービス開発をしてきて、ホスト名やパスワードをdotenvを使って管理してきた。
そういった情報はハードコーディングするわけにはいかないので、手動でdotenvのファイルを書き換えていた。
Secrets Managerを使うと少し管理が楽になる。
環境
Rails 5.2.0
aws-cli 1.15.34
Ubuntu 18.04 LTS
dotenv-rails 2.4.0
※アプリケーション名 iauth
シークレット値の登録
読まれたらいけない値を登録しておく。
secretsmanager コマンドを使えるようにする
下記のコマンドが使えるようにしておく。
$ aws secretsmanager get-secret-value --secret-id {keyname}
※新しめのaws-cliでないと secretsmanager をサポートしていないので注意する。
うまくいくと、登録した値がjsonで返ってくる。
{
"ARN": "arn:aws:secretsmanager:***",
"Name": "***",
"VersionId": "***",
"SecretString": "{\"RAILS_SECRET_KEY_BASE\":\"***\",\"IAUTH_DATABASE_HOST\":\"\\\"***\\\"\",\"IAUTH_DATABASE_USER\":\"\\\"***\\\"\",\"IAUTH_DATABASE_PASSWORD\":\"\\\"***\\\"\",\"REDIS_HOST\":\"***\",\"API_MASTER_TOKEN\":\"***\"}",
"VersionStages": [
"AWSCURRENT"
],
"CreatedDate": 1528447946.908
}
取得した値をdotenv形式にするスクリプト
取得した値を dotenv が読めるようにする。
get_secrets_from_aws.rb
require 'json'
ret = `aws secretsmanager get-secret-value --secret-id iauth `
begin
params = JSON.parse(ret)
secrets = JSON.parse(params['SecretString'])
rescue
return
end
envstr = "RAILS_SECRET_KEY_BASE=" + secrets['RAILS_SECRET_KEY_BASE'] + "\n"
envstr += "IAUTH_DATABASE_HOST=" + secrets['IAUTH_DATABASE_HOST'] + "\n"
envstr += "IAUTH_DATABASE_USER=" + secrets['IAUTH_DATABASE_USER'] + "\n"
envstr += "IAUTH_DATABASE_PASSWORD=" + secrets['IAUTH_DATABASE_PASSWORD'] + "\n"
envstr += "REDIS_HOST=" + secrets['REDIS_HOST'] + "\n"
envstr += "API_MASTER_TOKEN=" + secrets['API_MASTER_TOKEN'] + "\n"
print envstr
secretsを取得する capistrano タスクを書く
デプロイされるディレクトリに直接ファイルを作成する。
deploy.rb
namespace :deploy do
task :reload_secrets do
on roles(:web) do
execute "ruby /var/www/iauth/current/get_secrets_from_aws.rb > /var/www/iauth/current/.env"
end
end
end
これでデプロイタスクにsecretsの更新を含めることができた。