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をお試しください。