Terraform CloudでAWSリソースの手動変更を検出してみる(Drift Detection)

2022.11.02

「Terraform CloudのDrift Detectionを使えば、Terraform外からのリソース変更を継続的に監視・検出できます」

Terraform CloudのDrift Detection(ドリフト検出機能)では、実際の設定状態とTerraformで定義されている状態の差分を検出することができます。

今回はVPCをTerraformで作成して、手動でVPCの設定を変更しドリフト検出してみます。

Terraform Cloud Drift Detection機能の概要

概要は以下になります。

  • 実際の設定状態とTerraformで定義されている状態の差分を検知できる機能
  • Drift Detectionは24時間ごとに実行される
    • 現時点(2022/10時点)では、ユーザ側でスケジュールを定義して実行することはできない
  • Terraform Cloud Buisinessプランで使用できる(Freeプランでは使用できない)
  • 2022年9月にGA

詳細は以下が参考になります。

やってみた

ワークスペースとTerraformコードの用意

以下のコードを含んだGithubリポジトリを用意します。

main.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

# Configure the AWS Provider
provider "aws" {
  region = "us-east-1"
}

# Create a VPC
resource "aws_vpc" "example" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "main"
  }
}

Terraform Cloudで上記のリポジトリを使用するワーススペースを作成します。 ワークスペースの作成方法や、AWS認証情報の設定は以下をご覧ください。

Terraform Cloud上からRunして、リソースが作成(今回はVPC)されたことを確認します。

VPCのNameタグを手動で変更

Drift検出を試すために、Terraformで作成したAWSリソースを手動で変更します。 VPCのNameタグをmain→drift-testにマネジメントコンソールから手動で変更してみました。

Drift Dtectionの有効化

Drift Detectionはワークスペースまたはオーガニゼーション単位で有効化できます。 今回はワーススペース単位で有効化します。

「ワーススペース > Health > Settings」の「Health Assessments」をEnableにすることで、Drift Detectionが有効化されます。

実行タイミングについては、以下の記載がありました。 有効化した直後とその後は、24時間ごとに実行されるようです。2022/10時点では、間隔やスケジュールは指定できません。

  • No active runs: The first health assessment starts a few minutes after you enable the feature.
  • Active speculative plan: The first health assessment starts soon after that plan's completion.
  • Other active runs: The first health assessment starts in about 24 hours.

日本語訳

  • アクティブな実行なし: 機能を有効にしてから数分後に、最初の正常性評価が開始されます。
  • アクティブな投機的計画: 最初の健康評価は、その計画の完了後すぐに開始されます。
  • その他のアクティブな実行: 最初の正常性評価は約 24 時間後に開始されます。

Health - Terraform Cloud | Terraform | HashiCorp Developer

Drift結果の確認

有効化後、最初の実行までに数分時間がかかります。 しばらく待つと、「ワーススペース > Health > Drift」から検出結果を確認できます。

予想通り、タグの変更が検出されています。

Drift検出時の対応

検出時には以下どちらかの対応が必要になります。

  • Drift検出の変更結果を受け入れる: refresh-onlyオプションでStateファイルを更新する
    • 変更後のVPCのタグ「drift-test」を正とする
  • Drift検出の変更結果を受け入れない: 手動でRunを実行(terraform apply)するなどして、変更を上書きする
    • 変更前のVPCのタグ「main」を正とする

Drift結果を受け入れない手順は、普段通りRunしてリソースを変更する手順になります。

今回は、Drift検出の変更結果を受け入れる手順を紹介します。 この手順を実行すると、変更差分をstateファイルに取り込むことができます。 (今回の場合、stateファイルのVPCタグの部分が「drift-test」に変更されます。) tfファイルの方は、VPCタグは「main」になっているため、別途tfファイル側も変更する必要があります。

画面上部の「Actions」から「Start new run」でRunを開始します。

この際「Run Type」は「Refresh steate」を選択してください。(terraform [plan/apply ] -refresh-only 相当)

結果を確認して、実行します。

stateファイルを確認すると、変更が反映されたことを確認できます。

Drift Detectionの画面からもDriftが無くなった事を確認できます。

Drift検出時に通知

Drift検出時にSlackやメール宛に通知を飛ばすことも可能です。 ワークスペース > Notification > Health Eventsから設定できます。

Drift検出時には、以下のメールが届きました。 Driftの内容まではメール内に記載されないようです。

おわりに

Terraform CloudのDrift Detection機能についてでした。 Terraform管理しているリソースにTerraform以外の方法で変更が入ると、Terraformを使用して変更した際に意図しない差分が発生するということがあると思います。

Drift Detectionを使用することで、Terraform外の変更を早期に検知してトラブルを未然に防ぐことができます。

簡単に有効化できるため、ぜひ試してみてください。

以上、AWS事業本部の佐藤(@chari7311)でした。

参考