Rails
dotenv
aws-secrets-manager

AWS Secrets Managerからdotenvの設定ファイルを作る

概要

今までRailsでサービス開発をしてきて、ホスト名やパスワードをdotenvを使って管理してきた。

そういった情報はハードコーディングするわけにはいかないので、手動でdotenvのファイルを書き換えていた。

Secrets Managerを使うと少し管理が楽になる。

環境

Rails 5.2.0
aws-cli 1.15.34
Ubuntu 18.04 LTS
dotenv-rails 2.4.0

※アプリケーション名 iauth

シークレット値の登録

読まれたらいけない値を登録しておく。

スクリーンショット_2018-06-12_11_10_33.png

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の更新を含めることができた。