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 ではないのか
| JSON | YAML | HCL | |
|---|---|---|---|
| コメント | 書けない | 書ける | 書ける(# 推奨) |
| 式(変数・関数) | 書けない | 書けない(標準では) | 書ける(${...}、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 { ... } や resource "aws_s3_bucket" "hello" { ... } の 形そのもの」を分解していきます。