Terraformの使い方・導入・落とし穴：実践ガイド


## **1. はじめに**

Terraform は、インフラをコードで管理する **Infrastructure as Code（IaC）** ツールの一つであり、AWS、Azure、GCP などのクラウドリソースを **宣言的に** 構築・管理できます。

本記事では、Terraform の **導入、基本的な使い方、落とし穴、実際の経験から学んだポイント** を詳しく解説します。

---

## **2. Terraformの基本概念**

Terraform は **HCL（HashiCorp Configuration Language）** という独自の記法を使用し、クラウドリソースをコードで定義します。

✅ **メリット**
- **コードでインフラ管理** → 手作業のミスを防ぎ、再現性が高い
- **クラウドに依存しない** → AWS、GCP、Azure などマルチクラウドに対応
- **宣言的な管理** → 望む状態を定義し、Terraformが自動で変更適用
- **状態管理** → `terraform.tfstate` により、リソースの状態をトラッキング

❌ **デメリット**
- **学習コストがある** → HCLに慣れる必要がある
- **状態管理（State Management）が重要** → 破損するとリソース管理が困難
- **チームでの運用にはロック機構が必須** → Terraform Cloud などの活用が推奨

---

## **3. Terraformのインストールと導入**

### **🛠 Terraformのインストール**

#### **1. Terraform CLI をダウンロード**
```bash
# Macの場合（Homebrew）
brew install terraform

# Linuxの場合
sudo apt-get update && sudo apt-get install -y terraform
```

#### **2. バージョン確認**
```bash
terraform -v
```

---

## **4. Terraformの基本操作**

Terraform は以下の手順でリソースを管理します。

### **📝 Terraformの基本フロー**
1. **コードを書く (`.tf` ファイル作成)**
2. **初期化 (`terraform init`)**
3. **計画 (`terraform plan`)**
4. **適用 (`terraform apply`)**
5. **変更の破棄 (`terraform destroy`)**

### **📌 AWS EC2の作成例**
#### **1. Terraform 設定ファイルを作成（`main.tf`）**
```hcl
provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "web" {
  ami           = "ami-0abcdef1234567890"
  instance_type = "t2.micro"
}
```

#### **2. 初期化（`terraform init`）**
```bash
terraform init
```

#### **3. 計画（`terraform plan`）**
```bash
terraform plan
```

#### **4. 適用（`terraform apply`）**
```bash
terraform apply -auto-approve
```

#### **5. 破棄（`terraform destroy`）**
```bash
terraform destroy -auto-approve
```

✅ `terraform apply` でリソースを作成し、`terraform destroy` で削除できます。

---

## **5. Terraformの落とし穴と対策**

### **❌ 落とし穴 1: tfstate の管理ミス**
Terraform は `terraform.tfstate` というファイルでリソースの状態を管理します。このファイルが壊れると **リソースの整合性が取れなくなり、最悪の場合インフラが壊れる** ことがあります。

✅ **対策:**
- **Terraform Cloud や S3 バックエンドで tfstate を管理**
- **チーム運用では `terraform lock` を利用**

#### **S3にtfstateを保存する例（`backend.tf`）**
```hcl
terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "global/s3/terraform.tfstate"
    region = "us-west-2"
  }
}
```

### **❌ 落とし穴 2: `terraform destroy` で誤って全削除**
`terraform destroy` を誤って実行すると **全てのリソースが削除される** 危険性があります。

✅ **対策:**
- `terraform plan -destroy` で削除プレビュー
- `prevent_destroy = true` で重要なリソース削除を防ぐ

```hcl
resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-important-bucket"
  lifecycle {
    prevent_destroy = true
  }
}
```

### **❌ 落とし穴 3: Providerバージョンの不整合**
Terraform は **クラウドプロバイダ（AWS, GCP, Azure）ごとに Provider を利用** します。これが古いと `terraform apply` がエラーになります。

✅ **対策:**
```hcl
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 3.0"
    }
  }
}
```

---

## **6. Terraformを本番環境で運用するポイント**

✅ **1. S3 + DynamoDBでtfstateを管理する**
```hcl
terraform {
  backend "s3" {
    bucket         = "my-terraform-state"
    key            = "env/prod/terraform.tfstate"
    region         = "us-west-2"
    dynamodb_table = "terraform-lock"
  }
}
```

✅ **2. `terraform fmt` でコードフォーマット**
```bash
terraform fmt
```

✅ **3. `terraform validate` で構文チェック**
```bash
terraform validate
```

✅ **4. CI/CDと統合（GitHub Actions）**
```yaml
jobs:
  terraform:
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Terraform Init
        run: terraform init
      - name: Terraform Plan
        run: terraform plan
```

---

## **7. まとめ**

✅ Terraform を使うことで、インフラをコードで管理し、再現性を確保できる  
✅ `terraform.tfstate` の管理は **S3やTerraform Cloud** で行うのが安全  
✅ `terraform destroy` の誤用に注意し、 **`prevent_destroy` を設定**  
✅ **GitHub Actionsと連携** してCI/CDを構築すると自動化が進む  

Terraformを適切に活用し、安全かつ効率的なインフラ運用を実現しましょう！