★ 初級

01. はじめに ─ Terraform と HCL

そもそも Terraform は何をするツールで、HCL とはどういう言語なのか。なぜ JSON や YAML ではなく HCL なのか。最初に「なぜこれを学ぶのか」を整理します。

IaC(Infrastructure as Code)とは

AWS のマネジメントコンソールで「VPC を作って、EC2 を立てて、セキュリティグループを設定して……」と クリックで作るやり方 には、いくつもの問題があります。

IaC は、こうしたインフラ操作を コード(テキストファイル) として書き、Git で履歴管理し、ツールに「このコードの通りの状態に AWS を持っていって」と命令するやり方です。Terraform はその代表ツールです。

Terraform は何をするか

Terraform は 「望ましい状態(あるべき姿)」と「現状」の差分を計算して、API を叩いて差分を埋めるツール です。

[あなたが書いた .tf ファイル]   ← 望ましい状態
            ↓
[Terraform Core]                ← 差分計算
            ↓
[Provider プラグイン (AWS等)]    ← 各クラウドの API を叩く
            ↓
[AWS / Azure / GCP の API]      ← 現状を変更

ここで重要なのは 「Terraform は手順を書くものではなく、結果を書くもの」 という点。シェルスクリプトのように「これをしてからこれをして」と書くのではなく、「最終的にこういう VPC とこういう EC2 が存在していてほしい」 と書きます。差分の計算と実行順序の決定はツールの仕事です。

HCL という言語

HCL(HashiCorp Configuration Language) は HashiCorp が作った設定記述言語。Terraform 以外でも Vault、Consul、Packer などで使われています。Terraform 0.12 以降は HCL2 が標準で、本サイトもすべて HCL2 で書きます。

なぜ JSON や YAML ではないのか

JSONYAMLHCL
コメント書けない書ける書ける(# 推奨)
式(変数・関数)書けない書けない(標準では)書ける(${...}for、組み込み関数)
型システム無し緩いあり(string / number / list / object など)
視認性波カッコだらけインデント依存(壊しやすい)ブロック構造で読みやすい

HCL は 「人間が書いて読むためのデータ言語」 として設計されています。同時に、自動生成や他ツールから扱う用に JSON 構文 でも書けます(.tf.json)。学習用には HCL ネイティブ構文だけ覚えれば OK。

Terraform の基本ワークフロー

terraform init        # 初期化(provider と module のダウンロード)
terraform fmt          # 整形(チームで揃える)
terraform validate     # 構文・型チェック
terraform plan         # 差分の確認(適用前のドライラン)
terraform apply        # 差分の適用
# ここで AWS が変わる
terraform destroy      # 全部消す(学習で使い終わったらこれ)

本サイトを通じて何度も登場するこの 6 コマンドは、まず順番だけ覚えてください。09 章 で詳しく説明します。

インストール確認

terraform version
# Terraform v1.x.x が出れば OK

未インストールなら 公式インストールガイド を参照。

最小の動く例

「AWS の S3 バケットを 1 つ作る」だけの最小コード。意味は次章以降で詳しく説明するので、いまは「これくらいで AWS が動く」感だけ掴んでください。

terraform {
  required_version = ">= 1.6"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.80"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_s3_bucket" "hello" {
  bucket = "my-first-tf-bucket-20260510"  # 全世界で一意
}
terraform init
terraform plan    # "1 to add" と表示されるはず
terraform apply   # "yes" を入力すると本当に作られる
terraform destroy # 確認後に消す(料金事故防止)
これで Terraform を 1 度走らせた この感覚が掴めたら、次章で「いま書いた terraform { ... }resource "aws_s3_bucket" "hello" { ... }形そのもの」を分解していきます。