【ツール活用|実務向け】Terragruntで実現するTerraformのDRY運用:大規模インフラ管理の最適解

導入

Terraformを用いたインフラ管理において、環境(Dev/Stg/Prd)が増えるたびにbackend設定やprovider定義をコピー&ペーストしていませんか?この「コピペ地獄」は、設定ミスや変更漏れの温床となります。Terragruntは、Terraformの「薄いラッパー」として、これらの重複を排除し、コードをDRY(Don’t Repeat Yourself)に保つための強力なツールです。本記事では、大規模環境におけるTerraform運用の標準とも言えるTerragruntの活用術を解説します。

基礎知識

Terragruntは、Terraformの実行を抽象化するツールです。主に以下の2つの課題を解決します。
1. 設定のDRY化: 共通の設定(backend設定など)を親ディレクトリのファイルで定義し、子ディレクトリで継承させることで、記述量を劇的に減らします。
2. 依存関係の解決: 「VPCを作成してからサブネットを作成し、その後にデータベースを作成する」といったモジュール間の依存関係を明示し、実行順序を制御します。

実装/解決策

Terragruntを利用するには、ディレクトリ構成を工夫します。一般的に、ルートディレクトリに`terragrunt.hcl`を配置し、各環境・各モジュールからそれを参照する構成をとります。

サンプルプログラム

以下は、S3バケットをバックエンドとして利用するための共通設定例です。これを各環境のディレクトリから読み込むことで、backend設定を一元管理できます。

[ルートディレクトリのterragrunt.hcl]
remote_state {
backend = “s3”
generate = {
path = “backend.tf” # 自動生成されるファイル名
if_exists = “overwrite_terragrunt”
}
config = {
bucket = “my-terraform-state-bucket”
key = “${path_relative_to_include()}/terraform.tfstate”
region = “ap-northeast-1”
encrypt = true
dynamodb_table = “my-lock-table”
}
}

[各モジュールのterragrunt.hcl]
ルートの設定をインクルードする
include {
path = find_in_parent_folders()
}

呼び出すTerraformモジュールのパスを指定
terraform {
source = “../../modules/vpc”
}

モジュールに必要な変数を渡す
inputs = {
vpc_cidr = “10.0.0.0/16”
}

応用・注意点

現場で活用する際のポイントと注意点を挙げます。

1. 実行コマンドの変化: `terraform plan`の代わりに`terragrunt run-all plan`を使用します。これにより、依存関係にある全モジュールのプランを一度に確認可能です。
2. インフラ破壊の注意: `run-all destroy`は強力です。依存関係を考慮して削除されるため、意図しないリソースまで削除されるリスクがあります。実行前には必ずプランを確認してください。
3. バージョン管理: Terraform本体とTerragruntのバージョン整合性は重要です。`tfenv`や`asdf`を用いて、開発チーム全体でバージョンを統一することを強く推奨します。

Terragruntを導入することで、IaCのコードベースは非常にシンプルになります。まずは特定の一環境から導入し、その恩恵を実感してみてください。

コメント

タイトルとURLをコピーしました