【初学者向け】Terraformって何？LEGOブロックに例えてTerraformについてまとめてみた

未経験から、エンジニアになって４ヶ月くらい経った福井と申します。
Terraformでアプリケーションをデプロイすること経験をさせていただき、
その際に１からキャッチアップすることになったのですが、Terraform？何それ？となった経験から、初学者の方向けに簡単にTerraformについてまとめていきます！

自分はTerraformの存在すら知らなかったので、初めて聞いたよって方は、Terraformを知るきっかけになったら
嬉しいです。

TerraformはhashiCorpという企業が開発しているツールです。
vagrantも開発してる企業みたいです。

> 我々は組織のクラウド活用を成功に導く唯一無二のソフトウェアカンパニーです

とのことです！

Terraformとは？

https://www.datocms-assets.com/2885/1610079333-terraform-product-briefv9digitalweb.pdf

定義

> Terraformとは、開発者がHCL（HashiCorp Configuration Language）と呼ばれる高水準の構成言語を使用して、アプリケーションを実行するためのクラウドまたはオンプレミスのインフラストラクチャーの望ましい「最終状態」を記述できる宣言型コーディング・ツールです。次に、その最終状態に到達するための計画を生成し、その計画を実行してインフラストラクチャーをプロビジョニングします。

↑ちょっと単語を噛み砕いていきます。

> HCL（HashiCorp Configuration Language

HCL は、コマンドライン ツールで使用するための、人間とマシンの両方に優しい構造化された構成言語を作成するためのツールキット。主に DevOps ツール、サーバーなどを対象としている

https://github.com/hashicorp/hcl 



> オンプレミス（On-premises）
企業や組織が自社内にサーバーやネットワークなどのITインフラを設置し、運用する形態



> インフラストラクチャー
訳:サーバーやネットワークなどのインフラ設定


> 宣言型コーディング・ツール
「何を実現したいか」を記述するだけで、自動的にシステムがその状態になるように処理してくれるツール



定義を訳すと

Terraformは、HCLという人間にも機械にも優しい構成言語を使って「どんなインフラ環境を作りたいか」を記述するだけで、クラウドやオンプレミスのサーバーやネットワークなどの環境を自動で構築・管理できるツールということ。

じゃあもっとイメージしやすいようにLEGOに例えてやっていきます。

# **LEGOブロックに例えてTerraformのイメージをつかむ**
 
TerraformはLEGOブロックを組み立てる感覚でインフラを構築できちゃう便利なやつです。

## **1. LEGOとTerraformの共通点**

- **LEGOのブロック** = **クラウドリソース**  
  EC2インスタンスやS3バケット、ロードバランサーなどのリソースは、LEGOのブロックとイメージしてください。

- **LEGOの説明書** = **Terraformのコード（HCL）**  
  説明書に従ってレゴを組み立てると作品が出来上がるのと同じように、Terraformのコードを書くことでリソースが正確に作られます。

- **組み立ての土台** = **クラウドプロバイダー**  
  LEGOの土台プレートがAWS、Google Cloud、AZUREといったクラウドプロバイダーと思ってください！

---

## **2. TerraformでインフラをLEGOのように組み立てる流れ**

### **ステップ1: ブロックを並べる (`terraform init`)**

LEGOを始めるとき、まずブロックをテーブルに並べますよね。Terraformでも、まず `terraform init` を実行してセットアップします。このステップで、Terraformが必要なプロバイダーやプラグインを準備する形になります。

---

### **ステップ2: プランを練る (`terraform plan`)**

LEGOで「このパーツをここに置こう」とイメージするように、Terraformでも `terraform plan` コマンドを使ってどんな変更が加えられるのかを確認できます。

- **プレビュー機能**  
　terraformの場合は実際に、
  実際に手を動かす前に「本当にこの設計で良いのか？」をチェックできちゃいます。
---

以下は、S3バケット（LEGOの収納ボックス）を作成する例に変更したバージョンです：

---

### ステップ3: 組み立てる (terraform apply)
LEGOの説明書に従って組み立てを開始するのが、このステップです。`terraform apply` を実行すると、コードに書いた通りにリソースが自動的に構築されます。

アプリをデプロイする時に、画像を保存するためにS3をGUIで作成した人も多いのではないでしょうか？
以下のコードは「S3バケット（LEGOの収納ボックス）」を作る例です！

```hcl
provider "aws" {
  region = "us-west-1"
}

resource "aws_s3_bucket" "example" {
  bucket = "my-awesome-lego-box"
  acl    = "private"
}
```

上記コードでは、AWSプロバイダーを使ってS3バケットを作成しています。

provider "aws": AWSリソースを操作するための設定を指定します（例: リージョン設定）。
resource "aws_s3_bucket" "example": S3バケットを作成するリソース定義です。bucketプロパティでバケット名を指定し、aclでアクセス権限を設定します（例: private）。

これを適用するだけで、クラウド上に「S3バケット」が作成できちゃいます。  

---

### **ステップ4: 必要に応じて壊す (`terraform destroy`)**

LEGOの作品を一旦壊して別のものを作りたいとき、Terraformでは `terraform destroy` を使います。このコマンドでリソースを簡単に削除できます。
※全てリソースが削除してしまうので、実行には十分気をつけてください。

---

## **3. モジュール = LEGOシリーズのテーマセット**

LEGOには「お城シリーズ」や「宇宙船シリーズ」といったテーマのセットがありますよね。同じように、Terraformにも「モジュール」という概念があります。

- **再利用可能な設計図**  
  Terraformのモジュールを使えば、たとえば「Webアプリ用インフラ」や「データベース環境」を何度でも簡単に使い回せちゃいます。

---

## **4. チームで遊べる：Terraform Cloud**

LEGOを友達と一緒に遊ぶともっと楽しいですよね。同じように、Terraform Cloudを使うと、チームでインフラの設計と管理ができます。

- **複数人での協調作業**  
  gitと組み合わせて運用することで、
  誰がどの部分を変更したのかを確認しながら、効率的にインフラを管理できます

Terraform Cloudを使うと
- リモートバックエンド: 状態ファイル（Terraformの現在のリソース構成情報）をクラウド上で管理し、チーム全員で共有可能。
- CI/CDとの連携: GitHubなどと統合し、コードの変更を自動的に反映。
- ロールとアクセス管理: 変更権限を管理して、安全な運用ができる

---

## **5. LEGOとTerraformの最大の魅力**

### **LEGOの魅力**  
- パーツを自由に組み合わせて、どんな形でも作れる
- 何度でも作り直せる

### **Terraformの魅力**  
- コードでインフラを構築できる（Infrastructure as Code）
- クラウド環境をいつでも変更・再利用可能
Terraformは、クラウドリソースの「状態」をコードと状態ファイルで厳密に管理することができます。そのため、手動（GUI）で変更した場合のズレを検知し、再適用することなども可能です。

---

## **まとめ：Terraformでインフラを組み立てよう！**

Terraformは、LEGOのように直感的にインフラを構築できる便利なツールです。
このイメージを元に、Terraformについて学んでいくと、理解がスムーズになるのではないでしょうか！

## **その他**
https://naminori.xincere.jp/

https://portfolio.xincere.jp/