某スクールの最終課題であるフリマアプリの作成が始まりました。
私はスクラムマスターの担当になりましたので本番環境へのデプロイ担当になりました。
応用カリキュラムのチャットスペースでは、Railsのバージョンは5.0.7.2です。
なので、カリキュラムの内容もsercret.ymlを使ってAWSのEC2にデプロイする内容でしたが、今回、最終課題で使うバージョンはRails5.2です。
Rails5.2以降は仕様が変更されてsercret.ymlがcredentials.yml.encになっています。
デプロイ環境を構築するのにだいぶ苦労してしまったので、今回はcredentials.yml.encについてまとめていきたいと思います。
##credentials.yml.encとは
Rails5.2ではrails newをするとsercret.ymlの代わりにcredentials.yml.encが生成されるようになっています。
credentials.yml.encの役割は以下の通りです。
- secret.yml、secret.yml.enc、ENV[‘SECRET_KEY_BASE’]の3つのファイルを一元化
- 本番環境のみで使用する想定なので、環境毎に値を設定する必要がない
- 復号にはmaster.keyが必要(credentials.yml.encと一緒に生成されます)
Rails newをするとcredentials.yml.encと一緒にconfig/master.keyが生成されます。
config/master.keyはgitignoreに最初から追加されているので設定する必要はありません。
念を押すのであれば、credentials.yml.encもgitignoreに追加してもいいかもしれません。
##credentials.yml.encを編集する
credentials.yml.encは直接エディタから編集する事はできません。
ターミナルでエディタを指定して編集します。
vimで記述していますが、vim以外でも編集は可能です。
<ターミナル>
$ EDITOR=vim bin/rails credentials:edit
上記のコマンドを入力すると、ターミナルで下記の画面が表示されます。
※指定したエディタで開きます。今回はvimで指定したのでターミナルです。
<credentials.yml.enc>
# aws:
# access_key_id: 123
# secret_access_key: 345
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
上記の画面にawsのaccess_key_idやsecret_access_key、その他APIキーなどを入力すれば暗号化されて保存されます。
デフォルトで付いているコメントアウトは外しましょう。
言うなれば、master.keyは鍵、credentials.yml.encは秘匿情報を詰め込んだ箱の鍵穴に相当します。
credentials.yml.encで暗号化した秘匿情報をmaster.keyを使って復号します。
##capistranoによる自動デプロイ
手動でデプロイする場合はこれでOKなのですが、capistranoで自動デプロイをする場合は本番環境にshared/config/master.keyを作成して配置する必要があります。
scpコマンドを使って転送するのが良さそうです。
私は今回は本番環境のshared直下にconfigディレクトリを作成して直接master.keyをコピーしました。
##[本番環境]master keyの存在を確認する設定
本番環境ではmaster.keyの指定漏れを防ぐためにconfig/environments/production.rbに
config.require_master_key = trueを有効化することで、本番環境にmaser.keyが存在しない場合エラーになるよう設定できます。
<config/environment/production.rb>
config.require_master_key = true
##master.keyを紛失した場合
もし紛失してしまった場合はcredentials.ymlの復号ができなくなります。絶対に紛失はしないでください。
ですが、個人開発だったりチーム開発初期段階でcredentials.ymlに重要な記述がされていなかったりして捨てても良いのであれば再作成した方が良いです。
私は2回再作成しました笑
再作成の方法はcredentials.ymlを削除した後に、下記のコマンドを実行します。
<ターミナル>
$ sudo EDITOR=vim rails credentials:edit
コマンドを実行した時に、master.keyが存在していなければ作成されます。存在している場合は既存のmaster.keyがそのまま使われます。
今回は設定しませんでしたが、master.keyが共有できない環境では環境変数:RAILS_MASTER_KEYで指定できます。
master.keyがgitignoreにあらかじめ入っていたり以前より少し楽になった印象です。
開発環境やテスト環境で設定するような場面もありそう?
今回の実装を通して理解が深まりました。
参考
Rails5.2から追加された credentials.yml.enc のキホン
https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39
Rails5.2から導入されたcredentials.yml.encを極める
https://qiita.com/yuuuking/items/53a37a2e998972be32b8#%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83master-key%E3%81%AE%E5%AD%98%E5%9C%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A
Rails5.2からsecrets.yml*が廃止されcredentials.yml.encに統合されるよ
https://qiita.com/daichirata/items/da40e205d273ae69fcfc
Rails 5.2でActiveSupport::MessageEncryptor::InvalidMessage
https://qiita.com/scivola/items/cc06ddbfd94d3118f693