【初心者向け】Terraformってなに？簡単に整理してみた（ハンズオンなし編）

# 【初心者向け】Terraform整理（ハンズオンなし編）
先日業務でTerraformを用いてAWSを扱う機会があり、Terraform？自動化？IaC？となりましたので、整理のため自分なりに整理していきたいと思います。

## 1. Terraformとは？

Terraformは、HashiCorp社が開発した**インフラをコードで構築・管理できるツール**です。サーバ自身を作成する役割を持つ「プロビジョニングツール」とも言います。
「Infrastructure as Code（IaC）」を実現する代表的なツールの1つで、クラウドやSaaSのリソースを宣言的に定義して**自動的に**構築できます。

特に以下の点が特徴です：

- コードでインフラ構成を管理できる
- 実行前に差分を確認できる（`terraform plan`）
- 再現性が高く、チーム開発にも適している
- AWS/Azure/GCPなどの**マルチクラウド対応**

---
## 2. なぜTerraformを使う必要があるのか？
現在クラウドサービスを扱うにあたり、下記の課題があります。
 - 手動操作による人的ミスの発生
 - 同じ作業を行う際に毎回処理に時間を要する
 - 障害時の復旧に時間を要する

上記の課題を解決するために、IaCの概念に沿ったツールであるTerraformを活用する必要があります。

---
## 3. Terraform の主な特徴
ドキュメントを参考にすると、以下のような特徴が挙げられます。

 - **マルチプロバイダーへ対応**
AWS、Azure、GCP など、1000 以上のプロバイダーに対応。
Kubernetes、Helm、GitHub、Splunk など多様なサービスをサポート。
カスタムプロバイダーの作成が可能である。

 - **異なるプロバイダーのリソースを同じ言語で管理**
モジュール化による設定の再利用。
プロバイダー間のリソースを組み合わせた構成が可能である。
Terraform を使った効率的なデプロイメントフロー

 - **明確な 5 ステップのワークフロー**
Scope：プロジェクトのインフラの特定
Author：設定の作成
Initialize：初期化・プラグインのインストール
Plan：変更のプレビューを確認
Apply：変更の適用

---

## 4. IaCとは？

IaC（Infrastructure as Code）とは、インフラの構成・設定をコードとして記述する考え方です。

### ⛔ 従来の構築方法（非IaC）

- マウスでWebコンソールをポチポチ操作
- 手順が属人化・非効率
- 記録・再現性がない

### ✅ IaCを導入することで

- インフラ構成を**コード化して一元管理**
- Gitなどで**履歴管理・レビューが可能**
- 同じ構成を**何度でも自動構築**できる
- 自動テストやCI/CDパイプラインにも統合可能

Terraformは、このIaCを実践するためのツールの1つです。

---
#### :information_desk_person: 「自動テストやCI/CDパイプラインにも統合可能」と言いましたが、もう少し詳しくお伝えします。
  パイプラインとは、以下のような**ソースコードの変更からデプロイまでの自動化された流れ**のことです：

  📦 **1. ソースコードの変更（例：git push）**  
  → 開発者がコードを変更・保存し、Gitにプッシュします。

  ✅ **2. 自動テストの実行**  
  → 単体テストや構文チェックなどが自動で実行されます。

  🏗️ **3. インフラ構築（例：terraform apply）**  
  → テストが通れば、Terraformがクラウド環境を自動構築します。

  🚀 **4. アプリのデプロイ**  
  → 作成したインフラ上にアプリを自動で配置・実行します。

   このような一連の処理を自動でつなげた流れを「**パイプライン**」と呼びます。


---

## 5. TerraformとAWSの関係性は？

Terraformは**AWSを含む複数のクラウドに対応**しており、AWSと組み合わせることで非常に強力な自動化が可能です。

Terraformは、AWS用の **Provider（プロバイダー）** を通して、AWSのAPIにアクセスします。
※TerraformにおけるAWSのプロバイダー（provider）とは、TerraformがAWSと連携して操作を行うための橋渡し役をするコンポーネントのことです。
 💡 **Terraform** は「コードを読み取ってクラウドを操作するツール」
 
🔌 **プロバイダー** は「Terraformがクラウドと話すための翻訳機・通信手段」

### 例：AWS用プロバイダー設定

```hcl
provider "aws" {
  region = "ap-northeast-1"
}
```
この設定により、Terraformは「東京リージョンのAWSに対して操作する」という情報を取得できます。

また、Terraformは以下のようなAWSリソースにも対応しています：

- EC2（仮想サーバー）
- S3バケット
- VPC・サブネット・セキュリティグループ
- IAMユーザー・ロール　など

 :loudspeaker: **Terraform = AWS操作用のリモコン**のような存在です。

---

## 6. Terraformを使うことでどんなことができるのか？

Terraformを使うことで、AWSをはじめとしたクラウドインフラを**コード1つで一括構築・一括管理**できるようになります。


### ✅ 具体例にこういうことができます。

| やりたいこと                 | Terraformの構文例         |
|----------------------------|----------------------------------|
| EC2インスタンスを作成       | `resource "aws_instance"`       |
| S3バケットを作成            | `resource "aws_s3_bucket"`      |
| VPCとサブネットを構築       | `resource "aws_vpc"` / `aws_subnet` |
| IAMユーザーを作成           | `resource "aws_iam_user"`       |


---

## 7.例から見てみましょう！
![terraform　flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4073238/967f51a4-2660-4405-9379-297a2aea2cdc.png)

1. **terraform apply を実行**  
   → ユーザーがTerraformに「インフラを作って！」と命令します。

2. **State File を読み込む**  
   → すでに作ったものを確認します（状態の読み込み）。

3. **AWSへAPIで問い合わせ（READ）**  
   → 今AWSに何があるかをチェックします。

4. **State File の更新準備**  
   → 実際の構成に合わせて差分更新の準備をします。

5. **コードと状態の差分を比較（diff）**  
   → .tfファイルと現状の状態を比べて、作る／直す／消すを決定します。

6. **AWSに対してAPI実行（CREATE / UPDATE / DELETE / 何もしない）**  
   → 必要な操作がある場合のみAWSへ指示されます。

### ✅ その他の特徴

- `terraform apply` で **構築・更新を実行**  
- `terraform destroy` で **一括削除も可能**  
- `.tfstate` ファイルで **状態を管理**  

Terraformを使えば、**クラウドインフラの構成ミスを減らし、再現性のある構築作業**が実現できます。

---
### ✅ 参考
これから私が参考にさせていただくものを掲載させていただきます。
:point_right:公式ドキュメント
https://registry.terraform.io/providers/hashicorp/aws/latest/docs
:point_right:Terraform入門
https://qiita.com/kobayashi-m42/items/247cf9708044db8a234e
:point_right:Terraform に入門する
https://zenn.dev/oyasumipants/articles/6f8c03380d7171#terraform-init
:point_right:Terraformの特徴について整理してみた
https://qiita.com/zumax/items/379ce305c59fb4c3af94

---
:raised_hands:今回はハンズオンなしで、自分なりに整理していきましたが、少しでも皆様の参考になればと思います。
ご意見等いただけますと助かります。
次回は実際に手を動かしていきたいと思います。

### 終わり
---