導入:なぜ「Drift」の検知が重要なのか
IaC(Infrastructure as Code)を使ってAWSなどのクラウド環境を構築していると、運用中に「ちょっとだけ設定を変えたい」という場面が出てきます。しかし、コンソールから直接手動で設定を変更してしまうと、Terraformのコードと実際のクラウド環境の状態が食い違ってしまいます。この状態を「Drift(乖離)」と呼びます。Driftを放置すると、次にTerraformでデプロイした際に意図しない設定変更が走ったり、障害発生時の切り分けが困難になったりします。本記事では、この課題を解決するための基礎知識と対策を解説します。
基礎知識:Driftとは何か?
Driftとは、「コード上の理想の状態」と「クラウド上の現実の状態」のズレのことです。IaCツールは、管理下のインフラが「最後に適用した状態」であることを前提に動作します。しかし、誰かがコンソールから手動でセキュリティグループのルールを追加したり、インスタンスサイズを変更したりすると、ツールはその変更を把握できません。このズレを検知し、適切に対処することが、安定したインフラ運用には欠かせません。
実装/解決策:terraform planによる乖離の検知
Terraformを使用している場合、乖離を検知するのは非常にシンプルです。`terraform plan`コマンドを実行するだけで、Terraformは現在のクラウド上のリソースを確認し、コードと異なる点があれば差分を表示してくれます。
運用フローとしては、定期的に以下の手順を行うことを推奨します。
1. `terraform plan`を実行し、差分がないか確認する。
2. 差分が見つかった場合、それが「意図的な変更」か「事故(手動変更)」かを判断する。
3. 意図的であればコードを修正して`terraform apply`し、事故であれば手動変更を破棄してコードの状態に合わせる。
サンプルプログラム:乖離を検知するためのチェック用スクリプト
CI/CDパイプラインなどで自動的に乖離を検知するための、シェルスクリプト例です。
1. ワークスペースの初期化(初回のみ)
terraform init
2. planを実行し、結果をファイルに出力(-detailed-exitcodeを使うのがポイント)
0: 差分なし, 1: エラー, 2: 差分あり
terraform plan -detailed-exitcode -out=tfplan.out
3. 終了コードを確認して、差分があった場合に通知やログを残す
EXIT_CODE=$?
if [ $EXIT_CODE -eq 2 ]; then
echo “警告: インフラの乖離(Drift)が検知されました!”
# ここでSlack等に通知を飛ばす処理を追加できます
terraform show tfplan.out
elif [ $EXIT_CODE -eq 0 ]; then
echo “正常: コードとクラウドの状態は一致しています。”
else
echo “エラー: plan実行中に問題が発生しました。”
fi
応用・注意点:現場で陥りやすいバグと回避策
現場で最も多い失敗は、「乖離を放置したまま、別のチームメンバーがコードを更新してapplyしてしまうこと」です。これにより、意図せず手動変更が上書きされてシステムが停止するリスクがあります。
これを防ぐための対策として、以下の3点を意識しましょう。
・手動変更の禁止: 本番環境のコンソールアクセス権限を厳格に制限する。
・定期的な自動チェック: GitHub Actions等のCIツールを使い、毎日決まった時間に`terraform plan`を自動実行し、結果をSlackに通知する仕組みを作る。
・Driftの解消: 乖離を見つけたら必ず「コードを修正する」か「手動設定を元に戻す」のどちらかを即座に行い、状態を一致させる。
「IaCを使っているから安心」ではなく、「乖離を検知できる仕組み」を整えることこそが、真のDevOpsエンジニアへの第一歩です。ぜひ今日から取り入れてみてください。

コメント