はじめに
Render.comでなにも考えずデプロイしたら、development環境でデプロイされてしまいました。
production環境でデプロイしたくて試行錯誤したのでその方法と詰まった点を簡単にまとめてみました。
Render.comに環境変数を追加するために今までdashboardから追加していました。
.env
で環境変数を管理することも考えましたが、チーム開発の際の障害が大きすぎるのでcredentials.yml.enc
での管理を考えました。
Multi Environment Credentialsとは
credentialsはrails5.2
からサポートされ始めた機能です。
機密情報を暗号化し、安全に保護するためのものです。
Credentialsを使えば、復号化キーを紛失、もしくは盗難にあわない限り、機密情報を保護することができます。
rails6
よりMulti Environment Credentials機能が追加され、環境毎に秘匿情報を設定できるようになりました。
実際に設定する
最終的なcredentials.yml.enc
周りのファイル構成はこのようになる予定です。
.
│
└─config
│ credentials.yml.enc
│ master.key
│
└─credentials
production.key
production.yml.enc
rails new
を行ったときにconfig/credentials.yml.enc
が作成されると思います。
今回はこちらを開発、test環境ように使用します。
production環境用のcredentials.yml.enc
を作成する
EDITOR="vim" rails credentials:edit --environment production
これで以下のファイルが作成されます。
config/credentials/production.yml.enc
config/credentials/production.key
production.yml.enc
にsecret_key_base
を設定する
rails new
で作成されたconfig/credentials.yml.enc
にはsecret_key_base
の値が自動挿入されます。
Multi Environment Credentialsで作成されたファイルにはその値が記載されていません。
そのため、手動で設定する必要があります。
以下のコマンドでsecret_key_base
を生成します。
rails secret
上記のコマンドで生成されたキーを先ほど作成したconfig/credentials/production.yml.enc
に記載します。
EDITOR="vim" rails credentials:edit --environment production
secret_key_base: <生成されたキー>
設定しなければ以下のエラーが出ます。
rails aborted!
PMArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `bin/rails credentials:edit`
Render.comのDashBoardから環境変数を設定
production環境でデプロイするための環境変数を設定します。
設定する環境変数は以下です。
- RAILS_ENV: production
- RAILS_MASTER_KEY: *****
この時のRAILS_MASTER_KEY
はproduction.key
の値を設定します。
これで完了です。
正常にデプロイされれば成功です。
注意したいこと
-
config/credentials/production.yml.enc
はconfig/credentials.yml.enc
の内容をマージするわけではない -
config/credentials.yml.enc
のsecret_base_keyはconfig/credentials/production.yml.enc
に追記する必要があること
「config/credentials/production.yml.enc
はconfig/credentials.yml.enc
の内容をマージするわけではない」については以下の例で説明します。
setting_1: abcdefg12345
setting_2: hijklmn67890
setting_1: hellohello
ファイルの中身がこのようになっている場合、production環境では
Rails.application.credentials.setting_1
=>"hellohello"
Rails.application.credentials.setting_2
=>nil
となります。
読み込まれるのはconfig/credentials/production.yml.enc
だけです。
この2点を知らずにconfig/credentials.yml.enc
のsecret_base_key
が読まれると思い込み右往左往しました。