外に出るねくら

~ 外に出たって結局やることは自宅と同じ ~

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.encconfig/master.keyの2つが登場人物。
平文の認証情報をconfig/master.keyで暗号化し、その内容がconfig/credentials.yml.encに保存される。
Rails.application.credentials.digconfig/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の中を見てみると内容が変わっている。
以上