master.keyを作成していないとどうなるのか?
master.keyを本番環境で設定しておかなければ、rails db:create RAILS_ENV=productionなどを実行した際にエラーが表示される。
rails db:create RAILS_ENV=productionを実行
$ rails db:create RAILS_ENV=production
するとエラーが表示される
rails aborted!
NoMethodError: Cannot load database configuration:
undefined method `[]' for nil:NilClass
この'[]'はdatabase.ymlの下記が読み込めないために発生する。
production:
<<: *default
database: <%= Rails.application.credentials.db[:database] %>
username: <%= Rails.application.credentials.db[:username] %>
password: <%= Rails.application.credentials.db[:password] %>
socket: <%= Rails.application.credentials.db[:socket] %>
'[]'は、[:database]、[:username]、[:password]、[:socket]などの環境変数が読み込めないことを意味している。
AWSからすれば、「credentials.ymlの[:database]読み込めっていうけど、鍵がないからデータ見れねえええよおおお」
という状態です。
なぜ読み込めないのか?
credential.ymlの中身は他の人が閲覧できないように暗号化されている。
この暗号化を解除するのがmaster.key。
master.keyは扉を開ける鍵の役割をしており、鍵を使って解除しなければ、その先のデータを読み込むことができない。
これは、本番環境でも同じです。
master.keyがなければ、暗号化を解除できないので、環境変数を読み込めずエラーとなる。
本番環境のshared/configにmaster.keyを作成
ローカル環境にある,master.keyの中身を確認する
rails newで作成された、ローカルのmaster.keyを確認する。
$ vi config/master.key
すると下記のようにmaster.keyの中身が表示されます。
fadfdfdgaf44623535y....
この表示された、master.keyの値をコピーしましょう
表示されたmaster.keyをコピーします。
これを本番環境で貼り付けていきます。
本番環境でmaster.keyを作成
EC2のアプリのconfigを開きましょう
# 誤解が生まれやすいmaster.keyの作成場所
✖︎ アプリ名>config>master.key
○ アプリ名>shared>config>master.key
🚨アプリ名>shared>config>master.keyの場所に作成する必要があるので注意しましょう
#本番環境
[ec2-user@ip-172-31-23-189 ~]$ cd /var/ここはそれぞれ違います/[アプリ名]
[ec2-user@ip-172-31-23-189 <アプリ名>]$ cd shared/config
そうしたら、本番環境上でmaster.keyを作成します
[ec2-user@ip-172-31-23-189 config]$ vi master.key
# ローカル環境のmaster.keyの値を入力
fsdgagaf08deg424~~~~~
画像だと下記のような画面になります。
『 i 』を押すと----INSERT-----と表示がされて、文字入力ができます。
ここにコピーしたローカルのmaster.keyの値を貼り付けします。
『 esc 』ボタンを押した後、:wq入力して保存します
これで本番環境でもmaster.keyが設定されています。