概要
この記事では、Terraform と Terragrunt を用いた IaC 環境の効率的な管理手法を解説します。特に、複数の環境を一元管理し、自動化を通じてエラーを防止する方法を具体的なコード例を交えて紹介します。
この記事で伝えたいこと
- Terraform + Terragrunt のセットアップ方法
- 静的解析やセキュリティツールを活用した IaC の品質向上
- AWS CodePipeline を用いた CI/CD パイプライン構築
解決したい課題と原因
課題
- 大規模プロジェクトでのコード重複の削減
- インフラ設定ミスや構成変更時のリスク回避
- インフラ構築作業のスピードアップと安定性の向上
原因
- 各環境(開発、本番など)の設定を個別に管理
- 設定変更時の手作業によるエラー発生
- 統一されたワークフローやコードチェック機能の欠如
導入手順
1. Terraform + Terragrunt のセットアップ
Terragrunt ディレクトリ構成
以下のディレクトリ構成を参考にしてください:
/terraform
|-- aws
|-- envs
|-- develop
|-- terragrunt.hcl
|-- env_vars.yaml
|-- staging
|-- production
|-- modules
|-- sample-s3
|-- main.tf
|-- variables.tf
|-- outputs.tf
環境ごとの terragrunt.hcl
設定例
各環境固有の設定は terragrunt.hcl
に記述します。
# envs/develop/terragrunt.hcl
include "envs" {
path = find_in_parent_folders()
}
terraform {
source = "../../../modules/sample-s3"
}
inputs = {
env = "develop"
}
モジュール例 (main.tf
)
共通の S3 バケットを作成するためのモジュールです。
resource "aws_s3_bucket" "sample_bucket" {
bucket = "sample-bucket-${var.env}"
tags = {
Environment = var.env
}
}
variable "env" {
description = "環境名"
type = string
}
2. 静的解析とセキュリティチェックの導入
Pre-commit の設定
pre-commit-terraform
を使用してフォーマットやバリデーションを自動化します。
.pre-commit-config.yaml
の例:
repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
rev: v1.96.2
hooks:
- id: terraform_fmt
- id: terraform_validate
- id: terraform_tflint
- id: terraform_docs
セットアップコマンド:
pip install pre-commit
pre-commit install
TFLint の設定
tflint
を利用して命名規則やベストプラクティスの違反を検出します。
.tflint.hcl
の例:
plugin "aws" {
enabled = true
version = "0.28.0"
source = "github.com/terraform-linters/tflint-ruleset-aws"
}
rule "terraform_naming_convention" {
enabled = true
}
3. CI/CD パイプラインの構築
CodePipeline 用の Terraform モジュール
以下の例では、Plan、Approval、Apply のステージを含むパイプラインを作成します。
resource "aws_codepipeline" "codepipeline" {
name = "terraform-pipeline"
artifact_store {
location = "your-s3-bucket"
type = "S3"
}
stage {
name = "Source"
action {
name = "Source"
category = "Source"
provider = "GitHub"
output_artifacts = ["source_output"]
}
}
stage {
name = "Plan"
action {
name = "Plan"
category = "Build"
provider = "CodeBuild"
input_artifacts = ["source_output"]
output_artifacts = ["plan_output"]
}
}
stage {
name = "Approval"
action {
name = "ManualApproval"
category = "Approval"
provider = "Manual"
}
}
stage {
name = "Apply"
action {
name = "Apply"
category = "Build"
provider = "CodeBuild"
input_artifacts = ["plan_output"]
}
}
}
Buildspec ファイル例
Terraform Plan 用:
version: 0.2
phases:
install:
commands:
- echo "Installing Terraform..."
- tfenv install
build:
commands:
- echo "Running Terraform Plan..."
- terraform init
- terraform plan -out=tfplan
artifacts:
files:
- tfplan
成果を最大化するポイント
- 一貫性のある環境設定
terragrunt.hcl
を使って環境固有の設定を DRY 原則で管理します。 - 自動化で人的エラーを防止
Pre-commit、TFLint、CI/CD パイプラインを活用し、エラーを早期に検出します。
- ドキュメントの自動生成
terraform-docs
を利用して README.md を最新に保ちます。
留意点・デメリット
- 初期セットアップコスト
ツールや設定の習得に時間がかかる場合があります。 - ツールのバージョン管理
Terraform、Terragrunt、TFLint のバージョンを CI/CD パイプラインと同期する必要があります。