1. コンテンツタイプとフィールドの"とりあえず追加"問題

ある程度の規模のDrupalサイトを引き継ぐと、コンテンツタイプが20を超えているケースに遭遇することがあります。
中身を見ていくと、、、ほぼ同じ構造のものが微妙に違う名前で並んでいたり、フィールド名のつけ方に統一感がなかったり、使われていないフィールドが残っていたり――いわゆる"整理されていない"状態です。
Drupalではコンテンツタイプもフィールドも、管理画面から簡単に追加することができます。要件が出てきたタイミングで「とりあえず新しいタイプを作っちゃおう」という対応が技術的にしやすく、その都度の判断が積み重なった結果、全体像を誰も把握できなくなってしまうのです。
この問題の本質は、初期のデータモデル設計を省略してしまっていることにあります。Drupalの柔軟性は大きな強みですが、その強みは設計段階でしっかり活かしてこそ生きてくるものなのです。

対策のポイント

  • 構築初期にコンテンツモデルの全体像を描き、ドキュメントとして維持する
  • 新規のコンテンツタイプを追加する基準(データ構造が明確に異なる、運用フローが分かれる等)を最初に決める
  • フィールド命名規則を統一する(プレフィックスやスネークケースのルールなど)

※重要:「追加する基準」だけでなく「使わなくなったものを整理する基準」も決めておくと、長期運用での負債が溜まりにくくなります。

2. Viewsの魔改造によるパフォーマンス崩壊

Drupalで一覧系の機能を作るとき、まず候補に上がるのが Views ですよね。
フィルタ・ソート・リレーション・JOIN条件まで管理画面から組めるので、開発工数を大きく削減できる、本当に便利な機能です。
ただ、便利すぎることが裏目に出るパターンがあります。
「Viewsで作れるならViewsで作っちゃおう」が積み重なり、本来はカスタムクエリやサービス層で扱うべき処理までViewsに乗っかった結果、、、本番環境で一覧ページが何秒も返ってこない、という状況に陥ってしまうことがあるのです。
特に多いのは、Relationship を何段にも重ね、Contextual Filter を多用し、Rewrite results で表示加工までやっているケースです。
こうなると「Viewsを使った実装」というよりも「Viewsの形をしたアプリケーション」になってしまっていて、デバッグもチューニングも非常にしづらい状態になっています。

対策のポイント

  • Viewsで組む範囲の上限を最初に決めておく
  • 複雑なJOINや表示加工はカスタムクエリ/カスタムブロックに切り出す
  • キャッシュ戦略(Views CachingDynamic Page Cacheなど)を構築時に必ず設計する

※重要:Viewsは「ノーコードでどこまでやるか」の線引きが運用負荷を大きく左右します。便利だからこそ、その判断を構築初期に置いておくのがおすすめです。

3. アップデート放置によるメジャーバージョン移行地獄

「とりあえず動いてるから・・」という理由でアップデートを後回しにしているDrupalサイト、結構あるのではないでしょうか??
マイナーアップデートを止めていると、いざメジャーバージョン移行(Drupal 7→10、9→11など)が必要になったタイミングで、もはや移行ではなく"作り直し"に近い工数がかかってしまいます。
理由は単純で、依存しているContribモジュールが新バージョンに対応していなかったり、使っていたAPIが廃止されていたりするためです。
一気に乗り越えようとすると、モジュール選定からやり直しになってしまい、結果として「いまの仕様を維持したまま新しいバージョンで作り直す」というコスト構造になってしまうわけですね。
裏を返せば、計画的にアップデートを進められれば、Drupalは継続的に進化を続けているCMSなので、その恩恵を長く受け続けることができる、ということでもあります。

対策のポイント

  • マイナーアップデートは月次など定期的な運用フローに組み込む
  • EOL(End of Life)の半年前にはメジャー移行の検討を開始する
  • Contribモジュールを採用する時点で、過去のメジャーバージョン追従実績を確認する

※重要:採用するContribモジュールの「メンテナの活発度」と「過去のバージョン追従実績」は、構築時の選定基準に必ず入れておきたいポイントです。

4. 権限・ロール設計の場当たり対応

運用が長く続いたDrupalサイトでは、ロールが10〜20種類に増殖してしまっていることがあります。
「あの担当者にもこの編集権限を」「この部署だけプレビューできるように」――こうした個別要望に対して、その都度新しいロールやパーミッションを追加していった結果、誰が何をできるのか管理者ですら把握できない、、、という状態が生まれてしまうのです。
権限設計の難しさは、追加するときには痛みがなく、整理するときにだけ痛みが出てしまうことにあります。
新しい要望に対して既存ロールを再設計するよりも、新規ロールを作る方が早いですよね?その積み重ねで負債が蓄積していくのです。
さらにこの状態は、セキュリティリスクにも直結します。本来制限すべき操作がいつのまにか緩い権限に紐づいていた、というのは権限肥大化したサイトでよく起こる事象です。

対策のポイント

  • 構築時にロールマトリクス(ロール × 操作)を作成し、ドキュメントとして維持する
  • 最小権限の原則を徹底し、新規ロール追加には承認プロセスを置く
  • 年1回など定期的な棚卸しを運用に組み込む

※重要:ロールの棚卸しは「追加されたパーミッション」だけでなく「もう必要ないパーミッション」を外す観点で行うのがコツです。

5. テーマレイヤーへのビジネスロジック混入

本来テーマ(Twigテンプレートやpreprocess関数)は表示のための層なのですが、運用の中で「ちょっとした表示加工」が積み重なり、気がついたらビジネスロジックがテーマ内に散在している、、、ということが起こります。
たとえば次のような処理が、preprocess関数の中に直接書かれているケースです。

  • この条件のときだけ表示するラベルを変える
  • ユーザーのロールによって表示要素を切り替える
  • 特定の値を加工してフロントに渡す

短期的には動きますが、フロントのリニューアル時に「テーマを差し替えたらサイトの挙動が変わった!?」という事故につながってしまうわけです。
責務の境界が曖昧になることで、テスト範囲も読みづらくなり、引き継ぎ時の事故率も上がってしまうのです。
「ここで処理を書けば動く」という便利さが、長期的にはテーマとロジックの密結合を生み出してしまいます。

対策のポイント

  • テーマ層は「表示の整形」に限定する
  • 条件分岐を伴うロジックはカスタムモジュール/サービスに分離する
  • preprocess関数が肥大化してきたサインを見逃さず、定期的にリファクタリングを行う

※重要:preprocess関数に if 文が増え始めたら、それはロジックが滲み出しているサインです。早めにモジュール側へ寄せる判断を。

最後に

ここまで5つの失敗パターンを並べてきましたが、いかがでしたでしょうか?
実はこれら5つには、共通点があります。それは、いずれも初期の設計判断で結果が大きく変わってくる、という点です。
Drupalは非常に懐の深いCMSで、構築者の判断に多くの設計余地を委ねてくれます。コンテンツタイプの設計、Viewsの使い方、ロールの粒度、テーマ層の責務――どれをどう設計するかは、構築者に任されているわけです。
だからこそ、初期判断の質が、数年後の運用コストとして跳ね返ってくることになるのです。
逆に言えば、これらは構築初期の設計判断と、運用に判断ルールを組み込むことで、ほぼすべて回避することが可能です。"魔窟"は技術力の問題ではなく、設計判断の問題と言えるのではないでしょうか。
Drupalで何ができるかと、Drupalで何をやるべきかを丁寧に切り分けて設計する――この前提を持っているかどうかが、長く使えるサイトと"魔窟"との分岐点になるのです。
どうでしたでしょうか、初期設計の判断ひとつで運用の景色は大きく変わります。
ぜひDrupalプロジェクトの際は参考にしていただけると幸いです!