Drupalでの構成管理を強化するConfig IgnoreとConfiguration Split
2024年3月現在
Configuration Split モジュールもバージョンアップにより画面の項目名やオプションが変更されています。この記事と差異がありますのでご注意ください。
Drupal Advent Calendar 2023 4日目に向けて書いた記事です
では本題です。
Drupalの強力な機能としてConfiguration Management(構成管理)があります。
管理画面で設定したサイト構成に関わる設定はYAML形式のファイルでエクスポート/インポートできるので、簡単に異なる環境間のサイト構成が同期できます。
しかしながらAPIの接続先や開発中にだけ有効にしたいモジュールなど環境間で同期したくない設定もあります。
今回は環境間で異なる設定をConfig Ignoreモジュール、Configuration Splitモジュール、settings.phpの定義で管理する方法をご紹介します。
Config IgnoreモジュールとConfiguration Splitモジュールについては、管理画面の設定方法とエクスポートしたサイト構成(以下config)ファイルの中身がどのようであると良いのかを提示した上で、注意点とあわせてsettings.phpの定義で代替可能な部分があれば合わせて提示します。
Drupalマスターのみなさまへ
すでにこの辺りをマスターしているみなさまにはConfig Ignore の注意点だけみてもらえると嬉しいです。
3.x系で内部処理が大きく変更されているので運用中のサイトで見直しが必要かもしれないためです。
非同期を定義できるConfig Ignore
モジュール有効化し、動作モードと対象外とするconfigを指定すると動作します。
今回は基本的にバージョン3.1で動作確認を行っています。
基本設定 - Config Ignore
Configuration(環境設定) > Development(開発) > Configuration synchronization(構成の同期) のIgnore(無視)タブの設定ページに非同期にするconfigの名称を登録します。
Mode of operation は デフォルトのSimple
Configuration entity names to ignore のテキストエリアにExamplesを見ながら指定
ここで指定するconfiguration name(config名)とはYAML形式のファイルのファイル名から拡張子.ymlを外した文字列です
webform.webform.contact.yml を非同期にしたい場合は拡張子を webform.webform.contact の文字列です。
実際に出力したconfigのファイルを見ながら設定することをおすすめします。
https://scrapbox.io/files/656a9b1dd8936b0024b2a634.png
以下は設定例の一例です。
code:設定例.yml
# Webformで管理画面で作成したフォームすべて
webform.webform.*
# 上記の定義の上でcontactというフォームを例外とする(同期対象にしたい)時
~webform.webform.contact
# サイトのフロントページのURL値 (フロントページをコンテンツで提供する場合、環境毎にidが変わるので非同期の方が便利かも)
# config名:キー名.キー名 ・・・ と指定したいキーまで指定する
system.site:page.front
ここに指定したconfigはサイト構成の同期(インポート/エクスポートいずれも)の対象から外れます。
注意点 - Config Ignore
2023/10/30 にリリースされたバージョン3.0 は、2.x と比べて内部処理が大きく変更されています。 2.x系と3.x系で注意点が異なるのでそれぞれ記述します。
2.x系の注意点
Config Ignore の設定値もconfigなので異なる環境に最初に同期する時にタイミングのズレに気を付ける必要があります。
同期前にConfig Ignore の設定がサイト側にないと非同期対象になりません。
考慮なく実施すると以下のようなケースが発生します。
A環境
1. Config Ignore を管理画面から設定
2. configファイルをエクスポート
3. ファイルをGitなどで管理
B環境
1. Gitから最新ファイルを取得
2. サイト構成のインポート
このインポートはConfig Ignoreの設定がない状態の挙動です。ここが意図しない挙動と認識されやすいです。
このインポートでConfig Ignoreの設定がここで初めてサイトに適用されます。
3. サイト構成のインポート 2回目以降
自サイトにConfig Ignoreの設定が存在するので、定義に従ってインポートされます。
タイミングのズレを回避するとしては2つあります。
環境の最新化の際に必ず2回インポートを行う
ズレることを認識した上で2回以上インポートすれば最終結果は一緒になるためです。
settings.phpでconfigを上書きする
settings.phpであればファイル最新化やその前にConfig Ignoreの設定を定義できるのでタイミングのズレを気にしなくて良くなります。
settings.phpの記述例は以下です
code:settings.php
'webform.webform.*',
'~webform.webform.contact',
'system.site:page.front',
];
3.x系の注意点
Config Ignoreの設定が現在有効なconfigからではなく最終的に正とするconfigから取得するようになったことにより、2.xの注意点であったタイミングのズレ問題が解消されていますがsettings.php によるconfigの上書きが処理に影響を与えません。
インポート時はconfigのファイル群から取得した値を正とし、エクスポート時はこれから出力されるconfigを正とするようになっており、settings.php のconfigの上書きされた値を参照していません。
いままで2.xを利用していて3.xにバージョンアップする場合、 settings.php で上書きしていたConfig Ignoreの設定を、configのymlファイル側に正しく定義し直す必要があります。
この現象については今後のバージョンアップで処理が変わるかもしれません。
応用 - Config Ignore
3.x からモードの指定ができるようになり非同期のタイミングに合わせて細かく設定できるようになりました。
Simple
デフォルトはこちら。2.x の機能と同様。インポート/エクスポートともに同じ設定を利用する。
Intermediate
インポートとエクスポートで別々の設定を利用する。
Advanced
インポートとエクスポートに加えてconfigのCreate/Update/Deleteのタイミング毎に別々の設定を利用する。
Advancedモードの設定画面の例は以下のように6つの設定値が必要になります。
https://scrapbox.io/files/656a9b23d8936b0024b2a68e.png
Config Ignoreの説明は以上です。
分割と上書きができるConfiguration Split
モジュール有効化、分割・上書きするグルーピング定義を作成し環境毎に有効化を指定することで動作します。
基本設定 - Configuration Split
概要・準備
開発用、本番用の2つの定義を以下の内容で作成するケースを記述します。
table:各環境の設定例
本番用 開発用
名称 live dev
Views UI モジュール 無効 有効
ログの出力内容 なし すべて(バックトレース情報付き)
また分割・上書き用のconfigは出力先のディレクトリが異なります。最終的なconfigの出力先を以下とします。
code:ディレクトリ例
../config/
├── sync ・・・ メインのconfig群
└── splits
├── dev ・・・ 開発に関するconfig群
└── live ・・・本番に関するconfig群
メインのconfig出力先と環境別のconfig出力先が競合しないように事前にメインとなるconfigファイル出力先を settings.php で変更します。
code:settings.php
Configuration Split 管理画面の設定 - 基本
Configuration(環境設定) > Development(開発) > Configuration Split settings のページで Add Configuration Split setting から2つの設定を作成します。
ラベルは本番用はlive、開発用はdev
Static Settings の Active (アクティブ) はOFFにする
環境毎に有効/無効が異なるので デフォルトOFFにし、settings.php で環境毎に定義する方がおすすめです。
https://scrapbox.io/files/656a9b2af2cd6f002499f79d.png
Configuration Split 管理画面の設定 - 用語解説
Complete Split と Conditional Split の2パターンが設定できます。
どちらに指定するかによって同期時の挙動が変わるので頑張って理解してみてください。
Complete Split ・・・ configの分割
こちらに指定したconfigはメインのconfigから削除され、指定の出力先にのみconfigが出力されます。
configのインポート時はメインのconfig + 有効なConfiguration Split指定のconfigがインポートされます。
モジュール単位とconfig個別単位が指定できます。
特定の環境のみモジュールを有効化をできるのはこの機能だけです。
モジュールの有効化は指定可能ですが、無効化という指定はできません。
特定の環境だけモジュールを無効化した場合、メインではインストールせずComplete Splitで個別にモジュールを指定してインストールします。
Conditional Split ・・・ configの上書き
こちらに指定したconfigはメインのconfigはそのまま、個別の出力先に追加でconfigが出力されます。
インポート時にメインのconfigに対して有効なConfiguration Split指定のconfigを上書きする形でインポートされます。
Split only when different を有効にすると差分があるときだけ個別の出力先にファイルができます。
(個人的にはわかりにくくなるのでOFFにします)
管理画面の設定 - 本番用
本番用の設定を行います。
Static Settings
Folder に ../config/splits/live
アクティブ は 無効のまま
Complete Split
とくになし
Conditional Split
Configuration items で system.logging にチェックをつける
Split only when different のチェックを外す
https://scrapbox.io/files/656a9b2f5fa3a30025f6402f.png
https://scrapbox.io/files/656a9b3310c3860024b908e2.png
管理画面の設定 - 開発用
先ほど登録した開発用の設定を行います。
Static Settings
Folder に ../config/splits/dev
アクティブ は 無効のまま
Complete Split
Modules で Views UI にチェックをつける
Conditional Split
Configuration items で system.logging にチェックをつける
Split only when different のチェックを外す
https://scrapbox.io/files/656a9b36c63cfc0024fb1093.png
https://scrapbox.io/files/656a9b38e298570023bd5ad2.png
https://scrapbox.io/files/656a9b3cd18e3400224f86a9.png
開発用/本番用のconfigをエクスポート
Configuration Split の各環境用の設定を行ったので、各環境用の異なる内容を出力します。
開発用、本番用それぞれ実施します。
settings.php で出力したい方の設定を有効化する (下記参照)
管理画面で設定を変更する
ログの内容を変更したいので Configuration(環境設定) > Development(開発) > Logging and errors(ログとエラーメッセージ) のページで変更します。
キャッシュクリア
config のエクスポート
drush config:export など
code:settings.php
// 開発用の有効化はこちら
// 本番用の有効化はこちら
最終的に以下のようなconfigが出力されていれば成功です。
code:出力結果
../config/
├── sync ・・・ メインのconfig群
├── splits ・・・ 各環境用の設定
├── dev
│ ├── language
│ │ └── ja
│ │ └── tour.tour.views-ui.yml ・・・ Views UIに起因するconfigの翻訳(日本語のみのサイトは生成なし)
│ ├── system.logging.yml ・・・ ログに関するconfig
│ └── tour.tour.views-ui.yml ・・・ Views UIに起因するconfig
└── live
└── system.logging.yml ・・・ ログに関するconfig
開発用/本番用 それぞれの環境に適用
適用したいConfiguration Splitの設定をsettings.phpで有効化します。一つ前の手順の記述と同様です。
code:settings.php
// 開発用の有効化はこちら
// 本番用の有効化はこちら
この状態でキャッシュクリアをしインポートを行うと有効にした内容を含んだ状態でインポートされます。
例えばある環境で開発用のConfiguration Splitの設定をを初めて適用した時のdrushの結果は以下のようになります。
code:sh
murata@d101-web:/var/www/html$ drush cim
+-------------+--------------------+-----------+
| Collection | Config | Operation |
+-------------+--------------------+-----------+
| | tour.tour.views-ui | Create |
| | core.extension | Update |
| | system.logging | Update |
| language.ja | tour.tour.views-ui | Create |
+-------------+--------------------+-----------+
Import the listed configuration changes? (yes/no) yes: yes
notice Synchronized extensions: install views_ui. warning No configuration objects have been updated. notice Message: No configuration objects have been updated. notice Synchronized configuration: create tour.tour.views-ui. notice Synchronized configuration: update system.logging. notice Synchronized configuration: create tour.tour.views-ui in language.ja. notice Finalizing configuration synchronization. success The configuration was imported successfully. 注意点 - Configuration Split
有効/無効に注意
グルーピングのの有効/無効を制御するStatic Settings の Active (アクティブ) はOFFにした方が安全です。
デフォルトONになっているので意思をもってOFFにしないとconfigを分割したつもりですべて有効になっている可能性があります。Configuration Splitの定義一覧に状態が表示されるので確認することをお勧めします。
例えばStatic Settings の Active (アクティブ) はOFFにした上で、settings.php で有効化すると状態は active(overwiiten) と表示されます。
https://scrapbox.io/files/656a9b44c63cfc0024fb1191.png
Settings.phpで直接定義
環境別の差異が少ない場合、Configuration Split を利用せず環境毎に定義しても良いと思います。
code:settings.php
// settings.local.phpを読み込みます
// settings.local.php はGit管理せず、環境毎に内容が異なるイメージです
if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) {
include $app_root . '/' . $site_path . '/settings.local.php';
}
よくありそうな個別設定の例を挙げます。configの値であれば基本的には上書き可能です。
code:settings.local.php
// バックトレース情報付きログを出力
// Environment indicator モジュールで管理ツールバーの色を変更する (内容はモジュールのREADME.txtより)
// simpleSAMLphp Authentication モジュールで自分の開発環境だけDrupalログインを許可したい場合
// SMTP Authentication Support モジュールの定義を自分の開発環境だけ無効化したい時
// (検証・本番は指定のサーバに送信する必要があるが開発時はdocker内サーバの設定で動かしたい時)
Acquia Cloud Platform利用時
Acquia Cloud Platform利用時にはBLT によってConfiguration Splitの自動読み込みが定義されています。 ドキュメントに従ってラベル名や出力先のディレクトリを作成してください。
応用 - Configuration Split
Configuration Split はconfigの分割・上書きができるモジュールなので、環境ごとに1つの定義を有効にするだけでなく複数の定義を有効化して利用することも可能です。マルチサイトの場合、コンテンツタイプやボキャブラリの定義などサイト共通の定義をConfiguration Splitで分割しconfig群を共有することで管理画面の操作を 1/マルチサイト数 に抑えることができて便利だと思います。
このケースについて運用しているプロジェクトが存在することは知っているのですが、自身がプロジェクト管理をした実績がないので今後自分が経験したら追記する形にしたいと思います。
おしまいに
Drupalで環境毎に異なるConfigの管理する方法についてConfig Ignoreモジュール、Configuration Splitモジュール + settings.php を利用する方法のご紹介でした。
環境間のconfig共有と環境毎のconfig差分の管理をきちんと行うと、CI/CDによるデプロイ・テストができるようになり大規模化しつつあるDrupal開発が少しでも楽になると考えています。
それでは来年も良きDrupalライフを送りましょう!