Rails 5.2のCredential管理方法
背景
RailsからS3にファイルをアップロードするときに、認証情報を環境変数に持たせようとしていたが、どうやらそれをする必要はないということがわかった。
今回はそれをまとめます。
環境情報は以下。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS" $ ruby --version ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux] $ rails --version Rails 5.2.3
何をしようとしていたのか
ActiveStorageを使ってアップロード機能を実装しようとしていましたが、storage.ymlの編集時に以下の記載がありました。
amazon: service: S3 access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> region: ${region} bucket: ${your_own_bucket}
Rails.application.credentials.dig
とは。
AWS Access Keyとかはてっきり環境変数に保持して、ENV[AWS_ACCESS_KEY]
で参照するつもりでいたので、プチ想定外。
もちろんもともとの想定で実装を進めることも可能ですが、せっかくなのでちゃんと調べてみることに。
結局何なのか
Rails 5.2から追加されたCredentialの管理方法。
普通にRails Guideのリリースノートを見た。
config/credentials.yml.enc
とconfig/master.key
の2つが登場人物。
平文の認証情報をconfig/master.key
で暗号化し、その内容がconfig/credentials.yml.enc
に保存される。
Rails.application.credentials.dig
でconfig/credentials.yml.enc
にアクセスする。
gitとかに上げるときは、config/credentials.yml.enc
を上げて、config/master.key
は上げない。
こうすることで一元的に管理することができる。
いちいち環境変数に保存したり、環境変数から参照する手間が省ける。
どうすればいいのか
コンソールで以下のコマンドを実行する。
EDITOR=vim bin/rails credentials:edit
secret_key_baseはそのままにして、awsの情報を追記。
${access_key_id}と${secret_access_key}には各々の情報を記載する。
aws: access_key_id: ${access_key_id} secret_access_key: ${secret_access_key} # Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies. secret_key_base: ${secret_key_base}
config/credentials.yml.enc
の中を見てみると内容が変わっている。
以上