1. 概要
terraform planが遅い主な原因- リモートstateへの接続・大量リソース・APIレート制限
- 速くするための対策(
-target・parallelism・-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. 関連記事
- terraform state コマンド完全ガイド — state操作の基本
- 環境分離のパターン比較 — stateをディレクトリで分割
- backend — stateファイルの保存場所 — S3バックエンドの設定
- よくあるエラー集 — common_errors — 他のエラー一覧
- err_backend_changed — バックエンド変更エラー — state関連の問題
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