Active Record Encryption のキーを環境変数で直接指定可能に

rails/rails

#56455 で導入された Rails.app.creds の仕組みを活用し、Active Record Encryption の暗号化キーを専用の環境変数名で直接指定できるようになりました。これにより、config/application.rb に手動設定コードを書く必要がなくなります。

背景

これまで Active Record Encryption のキーを環境変数から設定するには、config/application.rb に明示的なコードを記述する必要がありました。公式ドキュメントでも以下のような手動設定例が案内されていました。

config.active_record.encryption.primary_key = ENV["ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY"]
config.active_record.encryption.deterministic_key = ENV["ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY"]
config.active_record.encryption.key_derivation_salt = ENV["ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT"]

この方式はアプリケーションコードへの侵食を招き、暗号化キーの取得経路をアプリケーション側で管理しなければならないという問題がありました。一方、#56455 によって Rails.app.creds は ENV、.env ファイル、暗号化済みcredentialsの順で値を解決できる統合インターフェースとして整備されていました。

本PRはこの Rails.app.creds の能力を活かし、規約となる環境変数名を定めることで、設定コードなしにキーを注入できる仕組みを確立します。

技術的な変更

activerecord/lib/active_record/railtie.rbactive_record_encryption.configuration イニシャライザが、app.credentials.dig から app.creds.option へ切り替わりました。

変更前:

initializer "active_record_encryption.configuration" do |app|
  ActiveSupport.on_load(:active_record_encryption) do
    ActiveRecord::Encryption.configure(
      primary_key: app.credentials.dig(:active_record_encryption, :primary_key),
      deterministic_key: app.credentials.dig(:active_record_encryption, :deterministic_key),
      key_derivation_salt: app.credentials.dig(:active_record_encryption, :key_derivation_salt),
      **app.config.active_record.encryption
    )

変更後:

initializer "active_record_encryption.configuration" do |app|
  ActiveSupport.on_load(:active_record_encryption) do
    ActiveRecord::Encryption.configure(
      primary_key: app.creds.option(:active_record_encryption, :primary_key),
      deterministic_key: app.creds.option(:active_record_encryption, :deterministic_key),
      key_derivation_salt: app.creds.option(:active_record_encryption, :key_derivation_salt),
      **app.config.active_record.encryption
    )

app.credentials.dig はRailsの暗号化済みcredentialsファイルのみを参照していましたが、app.creds.option は ENV → .env → 暗号化済みcredentials の順で値を解決します。これにより、以下の環境変数名を持つ値が自動的に認識されます:

  • ACTIVE_RECORD_ENCRYPTION__PRIMARY_KEY
  • ACTIVE_RECORD_ENCRYPTION__DETERMINISTIC_KEY
  • ACTIVE_RECORD_ENCRYPTION__KEY_DERIVATION_SALT

環境変数名の区切りに ダブルアンダースコア(__ が採用されている点が重要です。app.creds.option(:active_record_encryption, :primary_key) の呼び出しは、ネストされたキーパス active_record_encryption.primary_key に対応する環境変数として ACTIVE_RECORD_ENCRYPTION__PRIMARY_KEY を探します。シングルアンダースコアはキー名内の区切り文字として使われるため、ネストの区切りにはダブルアンダースコアが使用される規約です。

また、既存の暗号化済みcredentialsファイルに active_record_encryption.primary_key を記述する運用は引き続き動作します。解決の優先順位上、環境変数が存在すればそちらが優先されます。

設計判断

app.creds という統合インターフェースを経由させる設計が採用されました。

Active Record Encryption のキー取得ロジックをアプリケーション層(config/application.rb)からフレームワーク層(railtie)へ移動した点が本PRの本質です。環境変数を直接 ENV[] で参照する従来の手動設定では、キー名の命名が各アプリケーションに委ねられていましたが、今回の変更で ACTIVE_RECORD_ENCRYPTION__* という規約名が標準として確立されました。

この設計は app.creds が持つ多段解決の仕組みをそのまま利用しており、railtie 側に条件分岐を追加していません。ENV、.env、credentialsのどのソースから値が来るかはフレームワークが透過的に処理するため、アプリケーションコードはキーの出所を意識する必要がなくなります。

まとめ

本PRは Rails.app.creds の多段解決能力を Active Record Encryption のキー設定に適用し、規約となる環境変数名を定めることで設定の定型コードを不要にした変更です。app.credentials.dig から app.creds.option への1行の切り替えが、暗号化キーの管理をアプリケーション層からフレームワーク層へ引き上げるという設計上の意味を持ちます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
8b552fe5

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)という理想的な3部構成が明確に適用されています。必須要素はすべて満たしており、構成は非常に分かりやすいです。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```ruby:filepath)やPR番号のリンク記法([#123](URL))がガイドラインに準拠して正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Railsのrailtieやcredentialsの仕組みに関する知識を前提としており、専門知識を持つエンジニアという対象読者に完全に適合しています。過度な説明がなく、簡潔です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落もトピックセンテンスで始まるなど、パラグラフ・ライティングの原則がよく守られています。非常に読みやすいです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

`activerecord/lib/active_record/railtie.rb`のコード変更を正確に引用しています。また、`guides`から削除された従来の設定方法を「背景」で適切に引用しており、Diffの内容を深く理解していることがわかります。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`Rails.app.creds`, `app.creds.option`, `railtie`, `initializer`などの技術用語が正確かつ適切な文脈で使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

`app.creds.option`の解決順序や、環境変数名のネストを表現するためのダブルアンダースコア(`__`)の規約など、技術的な説明は正確かつ論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の主張はすべてPRのDescription、Diff、または関連PR(#56455)の仕様に基づいており、根拠のない推測や憶測(ハルシネーション)は一切見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#57311, #56455)や環境変数名(`ACTIVE_RECORD_ENCRYPTION__...`)などの数値・固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトル「Active Record Encryption のキーを環境変数で直接指定可能に」は、PRのタイトル「Accept Active Record Encryption credentials as ENV」の内容を的確に日本語で表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

バージョン情報やリリース日程など、PR情報に含まれない外部知識の持ち込みはありません。変更を理解する上で必要な `app.creds` の仕様への言及は、PR Descriptionで関連PRが示されているため妥当です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「これまで...でした」や「...できるようになりました」といった時間表現は、変更の前後関係を正確に反映しており、誤解を招く表現はありません。