Site cover image

Site icon imageViserhaut Tech Blog

This blog is a blog that records the daily learning of an infrastructure engineer. It aims to "Viser Haut" or strive for the highest.

Terraform と Terragrunt を活用した IaC 環境の構築手法

概要

この記事では、Terraform と Terragrunt を用いた IaC 環境の効率的な管理手法を解説します。特に、複数の環境を一元管理し、自動化を通じてエラーを防止する方法を具体的なコード例を交えて紹介します。


この記事で伝えたいこと

  • Terraform + Terragrunt のセットアップ方法
  • 静的解析やセキュリティツールを活用した IaC の品質向上
  • AWS CodePipeline を用いた CI/CD パイプライン構築

解決したい課題と原因

課題
  1. 大規模プロジェクトでのコード重複の削減
  2. インフラ設定ミスや構成変更時のリスク回避
  3. インフラ構築作業のスピードアップと安定性の向上
原因
  • 各環境(開発、本番など)の設定を個別に管理
  • 設定変更時の手作業によるエラー発生
  • 統一されたワークフローやコードチェック機能の欠如

導入手順

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

成果を最大化するポイント

  1. 一貫性のある環境設定

    terragrunt.hcl を使って環境固有の設定を DRY 原則で管理します。

  2. 自動化で人的エラーを防止

    Pre-commit、TFLint、CI/CD パイプラインを活用し、エラーを早期に検出します。

  3. ドキュメントの自動生成

    terraform-docs を利用して README.md を最新に保ちます。


留意点・デメリット

  • 初期セットアップコスト
    ツールや設定の習得に時間がかかる場合があります。
  • ツールのバージョン管理
    Terraform、Terragrunt、TFLint のバージョンを CI/CD パイプラインと同期する必要があります。