こんにちは、かつコーチです。
APIキーやパスワードをどこに書けばいいか、迷ったことはありませんか。
うっかりコードに直書きしてGitHubに公開してしまうと、大きな事故につながります。
この記事では、Railsのcredentials.ymlと環境変数、それぞれの使い分けを解説します。
読み終える頃には、秘密情報を安全に管理する方法が身につきます。
秘密情報を管理する2つの方法
credentials.ymlとは
credentials.ymlは、Railsが標準で用意している暗号化された設定ファイルです。config/credentials.yml.encという暗号化済みファイルと、復号のための鍵config/master.keyがセットになっています。
master.keyさえあれば、暗号化されたファイルの中身をいつでも復号できます。
環境変数とは
環境変数とは、OSやサーバー側で設定する変数のことです。
RailsのコードからはENV["API_KEY"]のように参照します。
ローカル開発ではdotenv-railsというGemを使い、.envファイルに書いた値を環境変数として読み込むのが定番です。
なぜ2つも方法があるのか
credentials.ymlはファイル自体をGit管理下に置けるため、チームで暗号化済みの設定を共有しやすいという利点があります。
一方、環境変数はホスティングサービスの管理画面から直接設定できるため、デプロイ環境ごとに値を切り替えやすいという利点があります。
用途に応じて使い分けるのが、実務での基本方針です。
実装手順
手順1:credentials.editでファイルを編集する
Rails 8では、次のコマンドでcredentials.ymlを編集します。
EDITOR="code --wait" bin/rails credentials:edit
エディタが開いたら、YAML形式で秘密情報を記述します。
stripe:
secret_key: sk_live_xxxxxxxxxxxx
smtp:
password: your_smtp_password
保存してエディタを閉じると、config/credentials.yml.encが自動的に暗号化されます。
手順2:コード内から値を読み込む
保存した値は、Rails.application.credentials経由で読み込みます。
# app/models/payment.rb
stripe_key = Rails.application.credentials.dig(:stripe, :secret_key)
digを使うことで、ネストしたキーも安全に取得できます。
手順3:master.keyの扱い
config/master.keyは、.gitignoreに自動で追加されており、Gitには含まれません。
本番サーバーには、このファイルを直接コピーするか、RAILS_MASTER_KEYという環境変数として渡します。
RAILS_MASTER_KEY=xxxxxxxxxxxxxxxx bin/rails server
master.keyを紛失すると、暗号化ファイルの中身を二度と復号できなくなるので注意してください。
手順4:dotenv-railsで環境変数を管理する
ローカル開発でこまめに値を切り替えたい場合は、dotenv-railsを使います。
# Gemfile
group :development, :test do
gem "dotenv-rails"
end
.envファイルにキーと値を書き、.gitignoreに必ず追加します。
STRIPE_SECRET_KEY=sk_test_xxxxxxxxxxxx
よくあるつまずきポイント・エラー対処
Before/After:master.keyをGitにコミットしてしまうケース
初めてcredentials.ymlを触ったとき、私は.gitignoreの設定を確認せずに作業を始めてしまいました。
❌Before:master.keyを誤ってコミットしてしまう
git add .
git commit -m "add payment feature"
git push
このコミットにはconfig/master.keyが含まれており、GitHub上で誰でも復号鍵を閲覧できる状態になっていました。
慌ててgit rmで削除しても、コミット履歴には残ったままです。
結局、master.keyを再生成し、credentials.ymlを作り直す羽目になりました。
✅After:コミット前に差分を必ず確認する
git status
git diff --cached --stat
master.keyが含まれていないことを確認してから、コミットするようにしました。
Rails 8のデフォルトでは.gitignoreに/config/master.keyが最初から記載されています。
しかし、.gitignoreを手動で書き換えた経験があるプロジェクトほど、こうした事故は起こりやすくなります。
まとめ
この記事のポイント
- credentials.ymlはGit管理できる暗号化ファイル、環境変数はサーバー側で直接設定する値
- master.keyがあれば復号できるため、
.gitignoreでの除外を必ず確認する - ローカル開発ではdotenv-rails、本番の秘密情報はcredentials.ymlという使い分けが基本
- コミット前に
git statusで差分を確認する習慣が事故防止につながる
次に読むべき記事
デプロイまわりの理解を深めたら、次は「RailsアプリをRenderにデプロイする方法」も合わせて読んでみてください。
環境変数の設定を実際のホスティングサービスで試すことで、理解がより深まります。
タグ: Ruby on Rails, 中級者向け, デプロイ