terraform planが遅い原因と高速化する方法

1. 概要

  • terraform planが遅い主な原因
  • リモートstateへの接続・大量リソース・APIレート制限
  • 速くするための対策(-targetparallelism-refresh=false
  • 根本的な設計改善(stateの分割)

terraform planが遅いと開発体験とCI/CDのフィードバックサイクルが悪化します。原因を特定して対策を打つことで大幅に改善できます。


2. 速度低下の主な原因

原因症状対策
リソース数が多いplanが数分以上かかるstateを分割・-targetで絞る
AWS APIのレート制限ThrottlingExceptionのリトライparallelismを下げる
リモートstateへのアクセスinit/planが遅いS3の配置リージョンを確認
refresh(stateと実態の差分確認)リソースを1つずつ確認-refresh=falseで省略

3. -refresh=false で高速化(CI向け)

# ✅ refreshをスキップ(stateとコードの差分のみチェック)
terraform plan -refresh=false

# ⚠️ 注意: 実際のAWSリソースの状態と差分が出ることがある
# CIのplan確認など「コードの変更を見たいだけ」の場合に有効

4. -target で特定リソースだけplanする

# 特定のリソースだけplanする
terraform plan -target=aws_instance.web
terraform plan -target=module.networking

日常的な開発では変更したリソースだけに絞るとフィードバックが速くなります。


5. parallelism で並列数を調整する

# AWSのAPIレート制限でThrottlingExceptionが発生する場合
# デフォルトは10(10リソースを並列に処理)
# 並列数を下げる(APIレート制限への対応)
terraform plan -parallelism=5

# 並列数を上げる(レート制限がなければ速くなる)
terraform plan -parallelism=20

6. stateの分割による根本解決

大規模プロジェクトでは1つのstateに全リソースを管理するのは限界があります。

# ❌ すべてのリソースが1つのstateに
project/
└── main.tf  # EC2・RDS・VPC・IAM...すべてここに

# ✅ レイヤーごとにstateを分割
project/
├── networking/   # VPC・サブネット・SG(変更頻度: 低)
├── database/     # RDS・ElastiCache(変更頻度: 低)
├── application/  # EC2・ECS・Lambda(変更頻度: 高)
└── iam/          # IAMロール・ポリシー(変更頻度: 低)
# networking/main.tf
terraform {
  required_version = ">= 1.9"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  backend "s3" {
    bucket = "my-company-tfstate"
    key    = "networking/terraform.tfstate"
    region = "ap-northeast-1"
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

variable "environment" {
  description = "環境名"
  type        = string
  default     = "dev"
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name        = "${var.environment}-main"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

output "vpc_id" {
  description = "VPC ID"
  value       = aws_vpc.main.id
}
# application/main.tf
terraform {
  required_version = ">= 1.9"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  backend "s3" {
    bucket = "my-company-tfstate"
    key    = "application/terraform.tfstate"
    region = "ap-northeast-1"
  }
}

# networking stateからVPC IDを参照
data "terraform_remote_state" "networking" {
  backend = "s3"
  config = {
    bucket = "my-company-tfstate"
    key    = "networking/terraform.tfstate"
    region = "ap-northeast-1"
  }
}

7. ThrottlingExceptionの対応

# AWSのAPIレート制限でplanが遅い・失敗する場合
AWS_MAX_ATTEMPTS=10 terraform plan -parallelism=3

8. 関連記事


9. まとめ

  • 原因別対策: リソース多すぎ→state分割、APIレート制限→parallelism減らす、毎回のrefreshが遅い→-refresh=false
  • terraform plan -refresh=falseはCIでのコード差分確認に有効
  • terraform plan -target=module.appで変更したリソースだけに絞ってフィードバックを速く
  • 根本解決はnetworking/database/applicationなどのレイヤーでstateを分割すること

動作確認バージョン: Terraform >= 1.9 公式ドキュメント: https://developer.hashicorp.com/terraform/cli/commands/plan