Terraformの基本コマンド:plan, apply, destroyの使い方
はじめに
前回は、Terraformの基本的なワークフローを体験しました。今回は、その中心となる主要コマンドの役割と使い方をより深く掘り下げていきます。これらのコマンドを正しく理解し、適切に使用することが、安全で効率的なインフラ管理に不可欠です。
Terraformコマンドの全体像
まず、Terraformの主要コマンドとその役割を整理しましょう:
| コマンド | 役割 | 影響範囲 | 使用頻度 |
|---|---|---|---|
terraform init |
初期化・プロバイダーのダウンロード | ローカル環境のみ | プロジェクト開始時 |
terraform validate |
設定ファイルの構文チェック | なし | 開発中・頻繁 |
terraform plan |
実行計画の生成・確認 | なし(読み取りのみ) | デプロイ前・必須 |
terraform apply |
実行計画の適用 | 実際のインフラ | デプロイ時 |
terraform destroy |
全リソースの削除 | 実際のインフラ | 環境削除時 |
1. terraform plan:実行計画の確認
terraform planコマンドは、実際の変更を適用する前に、何が変更されるかを詳細に確認するためのコマンドです。これは、インフラ変更の「事前レビュー」として機能します。
基本的な使い方
terraform plan
実行プロセスの詳細
Terraformは以下の手順で実行計画を生成します:
-
設定ファイルの読み込み: ローカルの
.tfファイルを解析 - 現在の状態の確認: ステートファイルと実際のインフラ状態を比較
- 差分の検出: 望ましい状態と現在の状態の違いを特定
- 実行計画の生成: 必要な変更操作を計画として出力
実行計画の読み方
出力される記号の意味:
| 記号 | 操作 | 説明 | 例 |
|---|---|---|---|
+ |
create | 新規作成 | 新しいEC2インスタンスの作成 |
~ |
update in-place | その場での変更 | タグの追加・変更 |
-/+ |
replace | 削除後に再作成 | インスタンスタイプの変更 |
- |
destroy | 削除 | 不要になったリソースの削除 |
高度なplanオプション
# 特定のリソースのみの計画を確認
terraform plan -target=aws_s3_bucket.example
# 計画をファイルに保存(後でapplyに使用)
terraform plan -out=tfplan
# 変数ファイルを指定
terraform plan -var-file="prod.tfvars"
# 計画の詳細な出力
terraform plan -detailed-exitcode
planの実践例
$ terraform plan
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
~ update in-place
- destroy
Terraform will perform the following actions:
# aws_instance.web_server will be created
+ resource "aws_instance" "web_server" {
+ ami = "ami-0123456789abcdef0"
+ instance_type = "t3.micro"
+ tags = {
+ "Name" = "WebServer"
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
2. terraform apply:実行計画の適用
terraform applyコマンドは、planで生成された実行計画を実際のインフラに適用するコマンドです。これが唯一、実際のインフラに変更を加えるコマンドです。
基本的な使い方
terraform apply
実行フロー
- 実行計画の再生成: 最新の状態で計画を再確認
- ユーザー確認: 変更内容を表示し、確認を求める
-
実行:
yesと入力された場合のみ、実際の変更を実行 - 状態の更新: ステートファイルに実行結果を記録
applyの重要なオプション
# 事前に保存した計画ファイルを適用
terraform apply tfplan
# 自動承認(CI/CD環境でのみ推奨)
terraform apply -auto-approve
# 特定のリソースのみ適用
terraform apply -target=aws_instance.web_server
# 変数ファイルを指定して適用
terraform apply -var-file="production.tfvars"
# 実行中の詳細ログを表示
TF_LOG=INFO terraform apply
安全なapplyのベストプラクティス
# 推奨される実行手順
# 1. 最新コードの取得
git pull origin main
# 2. プロバイダーの更新確認
terraform init -upgrade
# 3. 構文チェック
terraform validate
# 4. 実行計画の確認
terraform plan -out=tfplan
# 5. 計画の適用(人が確認してから実行)
terraform apply tfplan
apply実行時の注意点
⚠️ 重要な注意事項:
-
本番環境での
-auto-approveは避ける: 必ず内容を確認してから実行 -
計画ファイルの使用:
plan -outとapply <file>の組み合わせを推奨 - 段階的デプロイ: 大きな変更は小さく分けて実行
- バックアップの確保: 重要なデータは事前にバックアップ
3. terraform destroy:リソースの削除
terraform destroyコマンドは、Terraformが管理しているすべてのリソースを削除するコマンドです。
基本的な使い方
terraform destroy
destroyの動作原理
- 削除計画の生成: すべての管理対象リソースの削除計画を作成
- 依存関係の解析: リソース間の依存関係を考慮した削除順序を決定
- 削除の実行: 依存関係の逆順でリソースを削除
destroyの高度なオプション
# 特定のリソースのみ削除
terraform destroy -target=aws_instance.test_server
# 自動承認
terraform destroy -auto-approve
# 変数ファイルを指定
terraform destroy -var-file="dev.tfvars"
# 削除計画のみ確認(実際には削除しない)
terraform plan -destroy
部分的な削除の例
# 開発環境の特定リソースのみ削除
terraform destroy -target=aws_instance.dev_server -target=aws_s3_bucket.dev_bucket
# データベースを除く全リソースの削除
terraform state rm aws_db_instance.main # ステートから除外
terraform destroy # 除外されたリソース以外を削除
4. 状態管理コマンド
実際の運用では、状態を確認・操作するコマンドも重要です:
# 管理中のリソース一覧
terraform state list
# 特定リソースの詳細情報
terraform state show aws_instance.web_server
# リソースの移動(リファクタリング時)
terraform state mv aws_instance.old_name aws_instance.new_name
# リソースをステートから除外(インポート時の逆操作)
terraform state rm aws_instance.manual_created
5. 実用的なワークフロー例
開発環境でのワークフロー
# 1. 初期化
terraform init
# 2. 開発用設定での計画確認
terraform plan -var-file="dev.tfvars"
# 3. 開発環境にデプロイ
terraform apply -var-file="dev.tfvars"
# 4. テスト完了後、リソース削除
terraform destroy -var-file="dev.tfvars"
本番環境でのワークフロー
# 1. チーム共有の状態ファイル初期化
terraform init -backend-config="prod-backend.conf"
# 2. 本番用設定での詳細計画確認
terraform plan -var-file="prod.tfvars" -out=prod.tfplan
# 3. 計画をチームでレビュー後、適用
terraform apply prod.tfplan
# 4. 適用結果の確認
terraform output
6. トラブルシューティング
よくある問題と対処法
| 問題 | 症状 | 対処法 |
|---|---|---|
| ステートロック |
applyが固まる |
terraform force-unlock <LOCK_ID> |
| 状態の不整合 | 計画が意図と異なる |
terraform refresh で状態を同期 |
| プロバイダーエラー | APIエラーが発生 | 認証情報とアクセス権限を確認 |
| 依存関係エラー | 削除時エラー |
-targetで個別削除、または手動削除 |
デバッグに便利な環境変数
# 詳細なログ出力
export TF_LOG=DEBUG
terraform plan
# APIリクエストの詳細確認
export TF_LOG=TRACE
terraform apply
# ログをファイルに出力
export TF_LOG_PATH=terraform.log
terraform plan
まとめ:安全なTerraform運用のポイント
基本原則
- 必ずplanしてからapply: 意図しない変更を防ぐ
- 小さな変更を頻繁に: 大規模な変更よりリスクが低い
- 環境ごとの設定分離: dev/staging/prodで設定を分ける
- 状態ファイルの共有: チームでリモートステートを使用
- バックアップ戦略: 重要なデータは定期的にバックアップ
推奨されるコマンド実行順序
| 段階 | コマンド | 目的 |
|---|---|---|
| 準備 | terraform init |
初期化・プロバイダーダウンロード |
| 検証 | terraform validate |
構文エラーの確認 |
| 計画 | terraform plan -out=tfplan |
変更内容の事前確認 |
| 実行 | terraform apply tfplan |
計画の安全な適用 |
| 確認 | terraform output |
結果の確認 |
これらのコマンドを適切に使い分けることで、Terraformによる安全で効率的なインフラ管理が実現できます。
次回は、実際にVPCとサブネットを作成し、より複雑なインフラ構成でこれらのコマンドを活用する方法を学びます。お楽しみに!