インフラをコードで管理する「IaC(Infrastructure as Code)」は、AWSやGCPを扱うエンジニアにとって欠かせない考え方になっています。その代表格がTerraform。私も初めてTerraformを使ったときは、数行のコードからEC2を立ち上げられるのに感動しました。
ですが、実際のプロジェクトでは「環境ごとの変数管理が大変」「モジュールをたくさん作るとコードが散らばる」「ステート管理が複雑」といった課題にぶつかります。
そこで登場するのがTerragruntです。
Table of Contents
Terragruntの概要
Terragruntは、Terraformをラップして便利に使えるようにするツールです。Terraform自体を置き換えるものではなく、「Terraformの上にかぶせる追加ツール」と考えると分かりやすいです。
特に役立つのは以下のようなポイントです。
- 環境ごとの変数管理を楽にする
dev / stg / prod といった環境を簡単に切り替え可能。 - モジュールの再利用性を高める
一度作ったコードを複数環境で流用しやすい。 - ステート管理を整理
バックエンド(S3, DynamoDBなど)の設定を共通化できる。 - 依存関係を考慮した実行
VPC → サブネット → EC2 のように順番を意識してapply可能。
つまり、Terraform単体では「小さな構築」には十分ですが、チーム開発や大規模インフラではTerragruntを併用したほうが運用が楽になるというわけです。
TerraformだけでEC2を作る場合
まずTerraformだけでシンプルにEC2を立ち上げる例です。
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_instance" "example" {
ami = "ami-12345678"
instance_type = "t2.micro"
}
このコードを main.tf
に書いて、
terraform init
terraform apply
すればEC2が立ち上がります。とても簡単ですが、もし dev
用と prod
用に別々のインスタンスを作りたい場合、変数ファイルを分けたり、コードをコピペして書き換えたりする必要が出てきます。
Terragruntを使うとどうなるか?
Terragruntを導入すると、共通部分はモジュール化し、環境ごとの設定は terragrunt.hcl
に切り分けられます。
例として「EC2を立ち上げるモジュール」を作り、それを dev
と prod
で使い分けてみます。
1. モジュール(modules/ec2/main.tf)
variable "instance_type" {}
variable "ami" {}
resource "aws_instance" "this" {
ami = var.ami
instance_type = var.instance_type
}
2. terragrunt.hcl(live/dev/ec2/terragrunt.hcl)
terraform {
source = "../../../modules/ec2"
}
inputs = {
instance_type = "t2.micro"
ami = "ami-12345678"
}
3. terragrunt.hcl(live/prod/ec2/terragrunt.hcl)
terraform {
source = "../../../modules/ec2"
}
inputs = {
instance_type = "t3.medium"
ami = "ami-87654321"
}
これで dev
環境では小さなEC2、prod
環境では大きめのEC2を簡単に切り替えてデプロイできます。
実行方法もシンプルです。
cd live/dev/ec2
terragrunt apply
これで dev
用のEC2が立ち上がります。prod
に切り替えたいときは、live/prod/ec2
に移動して同じコマンドを打つだけです。
TerraformとTerragruntの使い分け
- 小規模・個人利用ならTerraformだけで十分
例:個人検証用のEC2を立ち上げたい場合。 - 複数環境・チーム開発ならTerragruntを導入
例:開発・検証・本番環境をコードで分けたい、大規模AWSインフラを管理したい場合。
Terraformを「エンジン」、Terragruntを「効率的に運転するドライバー補助機能」とイメージすると理解しやすいと思います。
まとめ
- Terraform:IaCの基本ツール。宣言的にAWSなどのリソースを構築できる。
- Terragrunt:Terraformを便利に管理するためのラッパーツール。特に環境管理やモジュール再利用に強い。
- メリット:環境ごとに設定を分離、ステートや依存関係の整理が容易になる。
私自身、最初はTerraformだけで満足していましたが、プロジェクト規模が大きくなるほどTerragruntのありがたみを感じています。「環境の違いをコードにどう表現するか?」という課題に直面している方は、ぜひ一度Terragruntを試してみると良いでしょう。