コンフィギュレーションドリフトとは?
コンフィギュレーションドリフトとは、文書化されていない変更が時間とともに蓄積することによって引き起こされる、実際に稼働しているインフラが意図された、あるいは宣言された構成から徐々に乖離していく現象です。
システムがセットアップした通りにそのまま保たれることはめったにありません。手作業による修正、緊急パッチ、その場しのぎの調整が積み重なり、やがて稼働環境はどのドキュメントやコードとも一致しなくなります。この意図された状態と実際の状態とのギャップがコンフィギュレーションドリフトであり、静かに信頼性を損なっていきます。
ドリフトとは何か
コンフィギュレーションドリフトとは、インフラが本来どう構成されているべきかと、実際にどう構成されているかとの差です。定義された構成をバイパスする手作業の変更が一つ加わるたびに、わずかな乖離が積み重なります。数か月かけて、同一だったサーバー同士が、そして定義とも、微妙かつ危険なほど異なるものになっていきます。
何が原因か
- インシデント中に適用され、コード化されないままの手作業のhotfix。
- サーバー上で直接行われる一度きりの調整。
- 失敗した、あるいは部分的にしか完了しなかった自動化の実行。
- Infrastructure as Codeのワークフロー外で行われた変更。
なぜ危険なのか
ドリフトはスノーフレークサーバー - 誰も完全には理解していない、固有で脆弱なマシン - を生み出します。それは典型的な「このマシンでは動くが、あのマシンでは動かない」という問題を引き起こし、インシデントの原因究明を難しくし、インフラのコードが現実を記述しなくなることを意味します。その結果、コードに基づいた変更が予期せず失敗することがあります。
ドリフトとInfrastructure as Code
Infrastructure as Codeは望ましい状態を宣言しますが、そのワークフローの外で現実が変更されるたびにドリフトが発生します。コードは一つのことを言い、稼働中のシステムは別のことを言っている状態です。再収束させるには、コードを再適用するか、乖離を検出して修正するかが必要であり、そこでドリフト検知(drift detection)が登場します。
ドリフトを防ぐ
最も効果的な防止策は、手作業の変更を不可能にするか無意味にすることです。イミュータブルインフラは稼働中のサーバーを一切変更しないことでドリフトを排除し、厳格なInfrastructure as Codeの規律はすべての変更がコードを通じて流れることを保証します。手作業でのアクセスが残る場合は、定期的なドリフト検知が乖離が深刻化する前に捉えます。
重要なポイント
- コンフィギュレーションドリフトとは、稼働中のインフラが定義された状態から乖離することです。
- 手作業による文書化されていない変更が時間とともに蓄積することから生じます。
- 脆弱なスノーフレークサーバーを生み出します。イミュータブルインフラとIaCの規律がそれを防ぎます。