repl.info

tfdiff: Terraformのモジュール間の差分を調べるためのツールを作った

Terraformでモジュール間の差分を比較するツールtfdiffを作りました。

tfdiffとは

tfdiffはTerraformのモジュール同士を比較・表示するコマンドラインツールです。 単純なファイル比較ではなく、HCLを解析して以下の要素ごとに差分を表示します:

  • モジュール呼び出し(module calls)
  • 出力(outputs)
  • リソース(resources)
  • データソース(data sources)
  • 変数(variables)

Terraformを使っていると、モジュール間でどんな違いがあるか比較したくなる時があります。 特に、ルートモジュールでproductionやstagingを分けて管理している時、呼び出しているモジュールが足りていなくて環境毎の差分が発生していたり、引数の差分が適切ではなかったりすることがあります。 こういうルートモジュール間の差分を確認するために素朴にdiffコマンドで比較するのもいいですが、モジュールの構造を考慮した差分が見たいケースもあります。 tfdiffはそういった用途で使えるツールです。

サンプル

以下のように、example/leftとexample/rightの2つのルートモジュールがあるとします。

example/
├── left/
│   ├── main.tf
│   ├── outputs.tf
│   └── variables.tf
└── right/
    ├── main.tf
    ├── outputs.tf
    └── variables.tf

left/main.tfにのみリソースが定義されている場合

片方でのみ定義して、もう片方で定義し忘れている場合を考えます。

# Web application infrastructure
resource "aws_instance" "web" {
  ami           = "ami-0c02fb55956c7d316"
  instance_type = "t2.micro"
  
  tags = {
    Name        = "WebServer"
    Environment = "production"
  }
}

このとき、tfdiffは以下のように差分として検出します。

% ./dist/tfdiff ./examples/basic/{left,right}
--- ./examples/basic/left
+++ ./examples/basic/right
-resource "aws_instance" "web" {
-}

left/main.tfとright/main.tfの両方にリソースが定義されているが、引数の値が異なる場合

両方で定義しているが、引数の値が違うケースも考えられます。

left/main.tf

# Web application infrastructure
resource "aws_instance" "web" {
  ami           = "ami-0c02fb55956c7d316"
  instance_type = "t2.micro"
  
  tags = {
    Name        = "WebServer"
    Environment = "production"
  }
}

right/main.tf

# Web application infrastructure - Updated version
resource "aws_instance" "web" {
  ami           = "ami-0c02fb55956c7d316"
  instance_type = "t3.small"  # Changed from t2.micro
  
  tags = {
    Name        = "WebServer"
    Environment = "staging"  # Changed from production
    Owner       = "DevOps"   # Added new tag
  }
}

デフォルトでは引数の差分は無視しており、差分なしとして表示します。

% ./dist/tfdiff ./examples/basic/{left,right}
--- ./examples/basic/left
+++ ./examples/basic/right

引数として --ignore-args=false を指定することで、リソース引数の差分も表示します。

% ./dist/tfdiff --ignore-args=false ./examples/basic/{left,right}
--- ./examples/basic/left
+++ ./examples/basic/right
 resource "aws_instance" "web" {
-  instance_type = "t2.micro"
+  instance_type = "t3.small"
 }

インストール方法

現在は go install でのみインストール可能です。

go install github.com/takaishi/tfdiff@latest

まとめ

tfdiffは、Terraformを使った開発・運用において、ルートモジュール間の差分確認を効率化できます。肥大化したルートモジュールを運用している場合、便利に使えるのではないかと思います。

Terraformの設定変更に伴うリスクを最小化し、より安全で効率的なインフラ管理を実現するために、ぜひtfdiffをお試しください。

リンク